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

SQL Server CTE -各子 ID の上位の親 ID を見つけますか?

    このようなことはできませんか?

    ;WITH cte AS (....)
    SELECT
        * 
    FROM 
        cte
    CROSS APPLY 
        dbo.myTable tbl ON cte.XXX = tbl.XXX
      

    CROSS APPLY を入れます CTE 定義 - CTE を参照する 1 つの SQL ステートメントに変換します。うまくいきませんか??

    または: - ロジックをひっくり返します - 「トップダウン」CTE を実行します。これは、最初にトップレベルのノードを選択してから、階層を反復処理します。このようにして、再帰的 CTE の最初の部分で「最上位の親」を簡単に判別できます - 次のように:

    ;WITH ChildParent AS
    (
        SELECT
            ID,
            ParentID = ISNULL(ParentID, -1),
            SomeName, 
            PLevel = 1,   -- defines level, 1 = TOP, 2 = immediate child nodes etc.
            TopLevelFather = ID  -- define "top-level" parent node
        FROM dbo.[Agent_Agents] 
        WHERE ParentID IS NULL
    
        UNION ALL
    
        SELECT
            a.ID,
            ParentID = ISNULL(a.ParentID, -1),
            a.SomeName, 
            PLevel = cp.PLevel + 1,
            cp.TopLevelFather   -- keep selecting the same value for all child nodes
        FROM dbo.[Agent_Agents] a
        INNER JOIN ChildParent cp ON r.ParentID = cp.ID
    )
    SELECT  
       ID,
       ParentID,
       SomeName,
       PLevel,
       TopLevelFather   
    FROM ChildParent
      

    これにより、次のようなノードが得られます (サンプル データに基づいて、わずかに拡張されています):

    ID  ParentID  SomeName      PLevel  TopLevelFather
    20    -1      Top#20           1          20
     4    -1      TOP#4            1           4
     8    -1      TOP#8            1           8
     7     8      ChildID = 7      2           8
     3     7      ChildID = 3      3           8
     2     4      ChildID = 2      2           4
     9    20      ChildID = 9      2          20
     5     9      ChildID = 5      3          20
     1     5      ChildID = 1      4          20
      

    この CTE 出力から特定の子ノードを選択すると、子の「レベル」とその最上位の親ノードを含む、必要なすべての情報が常に取得されます。



    1. トリガーがテーブルを認識しない(NEW.valuesのコンテンツを複数の行に分割して別のテーブルに挿入するトリガー)

    2. ApacheAirflowでのPostgresSqlの実装

    3. 日付を含む、Oracleの2つの日付間の日数を取得します

    4. OracleSQLのif-elseif-else'条件'