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

アンカーとメンバーに共用体がある再帰クエリ

    mainMenuを参照することはできません 一回以上。これは、実際には2つのアンカー式があり、1つはロール用、もう1つはユーザー用であるという事実が原因です。これを修正するには2つの方法があります。クエリを2つのCTE(1つはロール用、もう1つはユーザー用)に分割できます。このように:

    with
    roleMainMenu (...)
    as
    (
        -- role
        select ...
        from ....
            and parentID is null
        union all
        select ...
        from ....
            inner join  mainMenu on parentID = mainMenu.id
    ),
    userMainMenu (...)
    as
    (
        -- user
        select ...
        from ....
            and parentID is null
        union all
        select ...
        from ....
            inner join  mainMenu on parentID = mainMenu.id
    )
    select * from roleMainMenu
    union
    select * from userMainMenu
    

    または、事前にロール式とユーザーアンカー式を組み合わせることができます。子アイテムを取得するためのクエリがロールとユーザーの両方のメニューアイテムに対して一般的であるかどうかはわかりません。そうでない場合は、ロールとユーザーのルートアイテムの和集合を持つアンカー式を使用できます。

    with mainMenu (...)
    as
    (
        select root.* from
        (
            -- role roots
            select .. from ... and parentID is null
            union
            -- user roots
            select .. from ... and parentID is null
        ) root
        union all
        select ... from root
        inner join mainMenu on parentID = mainMenu.id
    )
    select *
    from mainMenu
    


    1. 句ごとにブール式を使用する

    2. java.lang.IllegalArgumentExceptionが発生するのはなぜですか。この場合、インデックス1のバインド値はnullです。

    3. リモート接続MysqlUbuntu-バインドアドレスが失敗しました

    4. EFが単純なクエリのサブクエリを生成するのはなぜですか?