Oto drzewo asemblera, które chcę wyszukać za pomocą T-SQL
zapytania rekurencyjnego (prawdopodobnie CTE
) z oczekiwanymi wynikami poniżej. Chcę poznać całkowitą kwotę na zespół danego elementu.
To znaczy, jeśli szukam „Nit”, chcę znać łączną liczbę na każdym poziomie w zespole, a nie tylko bezpośrednie dzieci.
Assembly (id:1)
|
|-Rivet
|-Rivet
|-SubAssembly (id:2)
| |
| |-Rivet
| |-Bolt
| |-Bolt
| |-SubSubAssembly (id:3)
| |
| |-Rivet
| |-Rivet
|
|-SubAssembly (id:4)
|-Rivet
|-Bolt
DESIRED Results
-------
ID, Count
1 , 6
2 , 3
3 , 2
4 , 1
Obecnie mogę uzyskać bezpośrednich rodziców, ale chcę wiedzieć, jak rozszerzyć moje CTE, aby umożliwić mi zwiększenie tych informacji w górę.
With DirectParents AS(
--initialization
Select InstanceID, ParentID
From Instances i
Where i.Part = 'Rivet'
UNION ALL
--recursive execution
Select i.InstanceID, i.ParentID
From PartInstances i INNER JOIN DirectParents p
on i.ParentID = p.InstanceID
)
select ParentID, Count(instanceid) as Totals
from DirectParents
group by InstanceID, ParentID
Results
-------
ID, Count
1 , 2
2 , 2
3 , 2
4 , 1
Skrypt tworzenia
CREATE TABLE [dbo].[Instances] (
[InstanceID] NVARCHAR (50) NOT NULL,
[Part] NVARCHAR (50) NOT NULL,
[ParentID] NVARCHAR (50) NOT NULL, );
INSERT INTO Instances
Values
(1, 'Assembly', 0),
(50, 'Rivet', 1),
(50, 'Rivet', 1),
(2, 'SubAssembly', 1),
(50, 'Rivet', 2),
(51, 'Bolt', 2),
(51, 'Bolt', 2),
(3, 'SubSubAssembly', 2),
(50, 'Rivet', 3),
(50, 'Rivet', 3),
(4, 'SubAssembly2', 1),
(50, 'Rivet', 4),
(51, 'Bolt', 4)
sql-server
t-sql
cte
recursive
markokstate
źródło
źródło
Nie jestem pewien, czy rozumiem, co masz na myśli przez „ilość” i skąd w tabeli (?) Identyfikator i liczba składników PartInstances i kolumn pochodzą z Twojej próbki, ale obliczyłem to, co sądzę na podstawie danych z próbki.
Mam nadzieję, że da ci to kilka pomysłów.
Aktualizacja
Rozumiem, że to jest przykład testowy, ale twoje dane psują wszystko, zaczynając od
1NF
. Najprawdopodobniej twój stół powinien zostać podzielony na dwie części i znormalizowany.źródło