यहां एक असेंबली ट्री है जिसे मैं नीचे अपेक्षित परिणामों के साथ एक पुनरावर्ती T-SQL
क्वेरी (संभवतः CTE
) का उपयोग करके खोजना चाहता हूं । मैं किसी भी भाग को दिए गए प्रति विधानसभा कुल राशि जानना चाहता हूं।
मतलब अगर मैं 'रिवेट ’खोजता हूं, तो मैं विधानसभा के भीतर प्रत्येक स्तर पर कुल गिनती जानना चाहता हूं, न कि केवल सीधे बच्चों की गिनती।
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
वर्तमान में, मैं प्रत्यक्ष माता-पिता को प्राप्त कर सकता हूं, लेकिन जानना चाहता हूं कि मुझे इस जानकारी को ऊपर की ओर रोल करने की अनुमति देने के लिए अपने सीटीई को कैसे बढ़ाया जाए।
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
रचना लिपि
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)