मैं एक लूप बनाने की कोशिश कर रहा हूं कि जब एक पार्ट आईडी दिया जाता है, तो यह असेंबली पार्ट्स की एक टेबल खोजेगा और सभी हिस्सों को एक बड़ी सूची में विस्फोट कर देगा।

इसे पुनरावर्ती होने की आवश्यकता है क्योंकि भाग 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
Dizzy49 8 जुलाई 2020, 01:08

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
1
AlwaysLearning 8 जुलाई 2020, 14:46