Help with recursive CTE query joining to a second table

前端 未结 1 1519
鱼传尺愫
鱼传尺愫 2021-01-22 20:35

My objective is to recurse through table tbl and while recursing through that table select a country abbreviation (if it exists) from another table tbl2 and append those results

相关标签:
1条回答
  • 2021-01-22 20:54

    Try this example, which will give you the output (1 sample row)

    id  Name    ParentID    Path    abbreviation    (No column name)
    5   China   2   Asia/China  CN,AS   Asia/China:CN,AS
    

    The TSQL being

    DECLARE @tbl TABLE ( 
         Id INT 
        ,[Name] VARCHAR(20) 
        ,ParentId INT 
        ) 
    
    INSERT INTO @tbl( Id, Name, ParentId ) 
    VALUES 
     (1, 'Europe', NULL) 
    ,(2, 'Asia',   NULL) 
    ,(3, 'Germany', 1) 
    ,(4, 'UK',      1) 
    ,(5, 'China',   2) 
    ,(6, 'India',   2) 
    ,(7, 'Scotland', 4) 
    ,(8, 'Edinburgh', 7) 
    ,(9, 'Leith', 8) 
    
    ; 
    DECLARE @tbl2 table (id int, abbreviation varchar(10), tbl_id int)
    INSERT INTO @tbl2( Id, Abbreviation, tbl_id ) 
    VALUES 
     (100, 'EU', 1) 
    ,(101, 'AS', 2) 
    ,(102, 'DE', 3) 
    ,(103, 'CN', 5)
    
    ;WITH abbr AS (
        SELECT a.*, isnull(b.abbreviation,'') abbreviation
        FROM @tbl a
        left join @tbl2 b on a.Id = b.tbl_id
    ), abcd AS ( 
              -- anchor 
            SELECT  id, [Name], ParentID,
                    CAST(([Name]) AS VARCHAR(1000)) [Path],
                    cast(abbreviation as varchar(max)) abbreviation
            FROM    abbr
            WHERE   ParentId IS NULL 
            UNION ALL
              --recursive member 
            SELECT  t.id, t.[Name], t.ParentID, 
                    CAST((a.path + '/' + t.Name) AS VARCHAR(1000)) [Path],
                    isnull(nullif(t.abbreviation,'')+',', '') + a.abbreviation
            FROM    abbr AS t 
                    JOIN abcd AS a 
                      ON t.ParentId = a.id 
           )
    SELECT *, [Path] + ':' + abbreviation
    FROM abcd 
    
    0 讨论(0)
提交回复
热议问题