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

自己参照テーブルを解析するときの CTE の無限ループ

    無限ループの原因は、empid=mgrid の最初のレコードです。 .この問題を処理するには、累積フィールドを含める必要があります (levels この例では) mgrid を保存します すでに処理済みで、emid かどうかを確認してください ループを避けるために、すでにこのリストに含まれています。

    クエリは次のとおりです:

    with Tree as
            (
            SELECT  empid
            ,       mgrid
            ,       1 as lv
            ,       1 as level1
            ,       null as level2
            ,       null as level3
            ,       null as level4
            ,       null as level5
            ,       cast(mgrid as varchar(max)) levels  
            FROM    Employees
            WHERE   empid = 1 and mgrid = 1
            UNION ALL
            SELECT  E.empid
            ,       E.mgrid
            ,       T.lv + 1
            ,       T.level1
            ,       case when T.lv = 1 then E.empid else t.level2 end
            ,       case when T.lv = 2 then E.empid else t.level3 end
            ,       case when T.lv = 3 then E.empid else t.level4 end
            ,       case when T.lv = 4 then E.empid else t.level5 end
            ,       T.levels+','+cast(E.mgrid as varchar(max)) levels   
    
              FROM    Employees AS E
            JOIN    Tree T
            ON      E.mgrid = T.empid 
                    and (','+T.levels+',' 
                          not like 
                         '%,'+cast(E.empid as varchar(max))+',%')
            )
    select  *
    from Tree
    order by empid
      

    SQLFiddle のデモはこちら




    1. SQLPlusvarchar2は空白を出力します

    2. 現在の列値とcodeigniterの増分で列値を更新するにはどうすればよいですか?

    3. 高可用性のためにChamiloMariaDBデータベースをデプロイする方法

    4. JDBCドライバーを使用してSQLServerでデフォルトの行プリフェッチを設定します