Home Forums SQL Server 2012 SQL Server 2012 - T-SQL Querying a Supersession Two Column Table with Multiple Supersessions in both Columns RE: Querying a Supersession Two Column Table with Multiple Supersessions in both Columns

  • This, for example, returns 0 rows for the last segment.

    CREATE TABLE #Supersessions

    (

    PartNo VARCHAR(20)

    ,PNPrior VARCHAR(20)

    );

    INSERT INTO #Supersessions

    SELECT 'RTC5756', 'STC9191'

    UNION ALL SELECT 'SFP500160','STC9191'

    UNION ALL SELECT 'STC9191','STC2951'

    UNION ALL SELECT 'STC3765','STC9191'

    UNION ALL SELECT 'STC8572','STC9191'

    UNION ALL SELECT 'STC9150','STC9191'

    UNION ALL SELECT 'STC8572','STC3333';

    CREATE TABLE #Source

    (

    PartNo VARCHAR(20)

    ,PartDesc VARCHAR(100)

    ,Price MONEY

    );

    SELECT 'SFP500160','KIT BRAKE LINING',58.02;

    CREATE TABLE #Hierarchy (Id int NOT NULL IDENTITY(1,1) PRIMARY KEY, [n] nvarchar(max), [OriginalPart] nvarchar(max), [PartNo] nvarchar(max), [PNPrior] nvarchar(max));

    DECLARE @N INT = 1

    ,@MyPartNo VARCHAR(20) = 'STC3333';

    INSERT INTO #Hierarchy([n], [OriginalPart], [PartNo], [PNPrior])

    SELECT n=@N, OriginalPart=@MyPartNo, a.PartNo, PNPrior

    FROM #Supersessions a

    WHERE a.PartNo = @MyPartNo OR a.PNPrior = @MyPartNo;

    /*

    SELECT n=@N, OriginalPart=@MyPartNo

    ,a.PartNo, PNPrior

    INTO #Hierarchy

    FROM #Supersessions a

    WHERE a.PartNo = @MyPartNo OR a.PNPrior = @MyPartNo;

    */

    WHILE @@ROWCOUNT > 0

    BEGIN

    SELECT @N = @N + 1;

    INSERT INTO #Hierarchy

    SELECT @N, OriginalPart, PartNo, PNPrior

    FROM

    (

    SELECT OriginalPart, b.PartNo, b.PNPrior

    FROM #Hierarchy a

    JOIN #Supersessions b ON a.PNPrior = b.PNPrior

    UNION ALL

    SELECT OriginalPart, b.PartNo, b.PNPrior

    FROM #Hierarchy a

    JOIN #Supersessions b ON a.PNPrior = b.PartNo

    UNION ALL

    SELECT OriginalPart, b.PartNo, b.PNPrior

    FROM #Hierarchy a

    JOIN #Supersessions b ON a.PartNo = b.PNPrior

    UNION ALL

    SELECT OriginalPart, b.PartNo, b.PNPrior

    FROM #Hierarchy a

    JOIN #Supersessions b ON a.PartNo = b.PartNo

    EXCEPT

    SELECT OriginalPart, PartNo, PNPrior

    FROM #Hierarchy

    ) a;

    END

    SELECT * FROM #Hierarchy;

    WITH AllParts AS

    (

    SELECT PN, rn, N, OriginalPart, m

    FROM

    (

    SELECT OriginalPart, PN, rn=ROW_NUMBER() OVER (PARTITION BY PN ORDER BY N), N, m

    FROM #Hierarchy a

    CROSS APPLY (VALUES (1, PartNo), (0, PNPrior)) b (m, PN)

    ) b

    WHERE rn = 1

    )

    SELECT b.PartNo, PartDec=MAX(b.PartDesc), Price=MAX(b.Price)

    ,Supercessions=REPLACE(STUFF(

    (

    SELECT '-' + PN

    FROM AllParts c

    ORDER BY N, m, CASE WHEN c.PN = b.PartNo THEN '' ELSE c.PN END DESC

    FOR XML PATH('')

    ), 1, 1, ''), '-', ' > ')

    FROM AllParts a

    JOIN #Source b ON b.PartNo = a.PN

    GROUP BY b.PartNo;

    GO

    DROP TABLE #Source;

    DROP TABLE #Supersessions;

    DROP TABLE #Hierarchy;