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

SQL再帰CTE:プロパティによってリンクされたオブジェクトの検索

    データ内のサイクルによって引き起こされる無限ループに遭遇しています。例:1> 2> 3>2>...。解決策は、すでに「消費」された行を追跡することです。 CTEには制限があるため、これは各CTE行に履歴を含めることによって行う必要があります。各行に到達するためにたどったパスを組み立てることによって。 , Pathのコメントを解除できます 最後のselect 何が起こっているかを確認します。

    -- Sample data.
    declare @ACC as Table ( AccNo Int, Property Char );
    insert into @ACC values
      ( 1, 'A' ), ( 1, 'B' ), ( 2, 'A' ), ( 2, 'C' ), ( 3, 'C' ), ( 4, 'D' );
    select * from @ACC;
    
    -- Recursive CTE.
    with Groups as (
      select distinct AccNo, AccNo as LinkedAccNo,
        Cast( '|' + Cast( AccNo as VarChar(10) ) + '|' as VarChar(1024) ) as Path
        from @ACC
      union all
      select G.AccNo, A.AccNo, Cast( Path + Cast( A.AccNo as VarChar(10) ) + '|' as VarChar(1024) )
        from Groups as G inner join -- Take the latest round of new rows ...
          @ACC as AP on AP.AccNo = G.LinkedAccNo inner join -- ... and get the   Property   for each ...
          @ACC as A on A.Property = AP.Property -- ... to find new linked rows.
          where G.Path not like '%|' + Cast( A.AccNo as VarChar(10) ) + '|%' )
      select AccNo, LinkedAccNo -- , Path
        from Groups
        order by AccNo, LinkedAccNo;
    


    1. SQLServerカーソルの手順を定義する-SQLServer/TSQLチュートリアル

    2. PostgreSQLはJSON配列として結果セットを返しますか?

    3. SQLServerのメモリ最適化テーブルでのインデックスの使用

    4. ORACLE-サブクエリでカウントを選択