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

OPTIONを使用した無限ループCTE(maxrecursion 0)

    再帰の制限に達している場合は、スポンサー関係にかなりの深さがあるか、データのループがあります。次のようなクエリは、ループを検出して再帰を終了します。

    declare @tblMember as Table ( MemberId Int, SponsorMemberId Int );
    insert into @tblMember ( MemberId, SponsorMemberId ) values
      ( 1, 2 ), ( 2, 3 ), ( 3, 5 ), ( 4, 5 ), ( 5, 1 ), ( 3, 3 );
    declare @MemberId as Int = 3;
    declare @False as Bit = 0, @True as Bit = 1;
    
    with Children as (
      select MemberId, SponsorMemberId,
        Convert( VarChar(4096), '>' + Convert( VarChar(10), MemberId ) + '>' ) as Path, @False as Loop
        from @tblMember
        where MemberId = @MemberId
      union all
      select Child.MemberId, Child.SponsorMemberId,
        Convert( VarChar(4096), Path + Convert( VarChar(10), Child.MemberId ) + '>' ),
        case when CharIndex( '>' + Convert( VarChar(10), Child.MemberId ) + '>', Path ) = 0 then @False else @True end
        from @tblMember as Child inner join
          Children as Parent on Parent.MemberId = Child.SponsorMemberId
        where Parent.Loop = 0 )
      select *
        from Children
        option ( MaxRecursion 0 );
    



    1. MySQLサーバー接続は暗号化されて安全ですか?

    2. Mysql 1050エラーテーブルはすでに存在しますが、実際には存在しません

    3. MySqlエラー150-外部キー

    4. 列の順序が考慮されていない(設定されている)一意のインデックスを作成する方法