sql >> データベース >  >> RDS >> Sqlserver

2 番目のテーブルに結合する再帰 CTE クエリのヘルプ

    この例を試してみてください。出力が得られます (1 つのサンプル行)

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

    TSQLは

    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 
    



    1. mySQLの元の行番号を返す

    2. MySQLでのREGEXP_INSTR()関数のしくみ

    3. Postgresにモジュールをインポートしたり拡張機能をインストールしたりするにはどうすればよいですか?

    4. MySQLからLONGBLOBを読み取る方法