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

親レコードを見つけるための再帰クエリ

    これを試してください:

    declare @t table (
     childID int,
     ParentID int,
     level int
    )
    
    insert into @t
    select 71, 154, 4
    union
    select 154, 192, 3
    union
    select 192, 209, 2
    union
    select 209, 0, 1
    
    Declare @SearchChild int
    set @SearchChild=71
    
      ;with MyCTE as (
          select t1.childID, t1.ParentID , @SearchChild AS searchChild, t1.level
            from @t t1 
            where t1.childID = @SearchChild
          UNION ALL
          select t1.childID, t1.ParentID , c.SearchChild, t1.level
            from @t t1
            inner join MyCTE c on t1.childID=c.ParentID
      )
    select top 1 * from MyCTE order by level asc
    

    出力:

    childID     ParentID    searchChild level
    ----------- ----------- ----------- -----------
    209         0           71          1
    

    あなたが何を求めているのかわかりません。209と71が一緒になっている行はありませんか?これがあなたにできる最善のことです。また、このCTEはチェーンを上向きに機能し、下向きには機能しないため、大きなテーブルではるかにうまく機能するはずです。



    1. EFコアでのMySQLゼロ日付の処理

    2. 多対多の関係のためにノードmysqlに重複レコードを挿入するのをブロックする方法は?

    3. 同じテーブルのサブクエリに基づいてテーブルの行を更新する

    4. データベースにデータを挿入する並行プロセス