मैं एक लूप बनाने की कोशिश कर रहा हूं कि जब एक पार्ट आईडी दिया जाता है, तो यह असेंबली पार्ट्स की एक टेबल खोजेगा और सभी हिस्सों को एक बड़ी सूची में विस्फोट कर देगा।
इसे पुनरावर्ती होने की आवश्यकता है क्योंकि भाग 123 में भाग 1, 2, 3, 4, 5 हो सकते हैं और भाग 4 और 5 भी असेंबली आइटम हैं। मैंने सोचा कि मैं कुछ बहुत अच्छा लेकर आया हूं और आसानी से प्रत्येक आइटम के लिए पार्ट आईडी और पार्ट लेवल लौटाता हूं। तब मुझे पता चला कि मैं अस्थायी तालिकाओं का उपयोग नहीं कर सकता, इसलिए यह मेरे लूप को नीचे गिरा देता है।
मुझे यहाँ वही कार्य देने के लिए मैं अस्थायी तालिका के स्थान पर क्या उपयोग कर सकता हूँ?
CREATE FUNCTION [dbo].[fn_getParts] (
@source_part_id int
, @level int
)
RETURNS @parts_list TABLE (
[part] int NOT NULL,
[level] int NOT NULL
)
AS
BEGIN
DECLARE
@max int = 0,
@cnt int = 0,
@PID int = 0,
@Plvl int = 0,
@id int = 0
INSERT INTO @parts_list VALUES (@source_part_id, @level)
SET @level += 1
SELECT [Comp_Part_ID] AS [PID], @level AS [level]
INTO #chkParts
FROM [assemblies]
WHERE [Assy_PID] = @source_part_id
SELECT @max = COUNT(*) FROM #chkParts
WHILE @cnt <= @max
BEGIN
SELECT @PID = [PID], @Plvl = [level] FROM #chkParts
INSERT INTO @parts_list
SELECT * FROM [fn_getParts](@PID, @Plvl)
SET @cnt += 1
END
RETURN
END
यहाँ कुछ नमूना डेटा है:
CREATE TABLE [Assemblies] (
[PartID] int,
[Comp_PartID] int
)
INSERT INTO [Assemblies] VALUES
(1,2),
(1,3),
(1,4),
(1,5),
(1,6),
(3,9),
(3,10),
(10,11),
(10,23),
(10,24),
(10,31),
(11,24),
(11,23)
अगर मैं SELECT * FROM [fn_getParts](1,0)
दर्ज करता हूं तो मैं निम्नलिखित की अपेक्षा करता हूं:
part,level
1,0
2,1
3,1
4,1
9,2
10,2
11,3
23,3
24,3
1 उत्तर
रिकर्सिव सीटीई के आसपास इनलाइन टेबल-वैल्यूड फंक्शन लपेटकर कोड को कुछ हद तक सरल बनाया जा सकता है, उदाहरण:
create function dbo.fn_getParts (
@source_part_id int
)
returns table as return (
with PartsHierarchy as (
select @source_part_id as part, 0 as level
union all
select Comp_PartID, 1 + level
from Assemblies
join PartsHierarchy on part = PartID
)
select part, level
from PartsHierarchy
);
और फिर, इसे अलग-अलग भाग संख्याओं के लिए आमंत्रित करना ...
select * from dbo.fn_getParts(1);
part level
---- ----
1 0
2 1
3 1
4 1
5 1
6 1
9 2
10 2
11 3
23 3
24 3
31 3
24 4
23 4
select * from dbo.fn_getParts(10);
part level
---- -----
10 0
11 1
23 1
24 1
31 1
24 2
23 2
select * from dbo.fn_getParts(11);
part level
---- -----
11 0
24 1
23 1
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।