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

SQL SERVER 2005 で子を指定して親を取得する方法

    child_id を node に、parent_id を child_of に名前変更する必要があると思います。列の命名が少しわかりにくいです

    create table stack_overflow
    (
    node int, child_of int
    );
    
    
    insert into stack_overflow(node, child_of) values
    (1,0),
    (2,1),
    (3,2),
    (4,2),
    (5,3),
    (6,4),
    (7,0),
    (8,7),
    (9,8),
    (10,1);
    

    これは、CTE 対応の RDBMS で機能します :

    with find_parent(parent, child_of, recentness) as
    (
        select node, child_of, 0 
        from stack_overflow
        where node = 9
        union all
        select i.node, i.child_of, fp.recentness + 1
        from stack_overflow i
        join find_parent fp on i.node = fp.child_of
    )
    select top 1 parent from find_parent 
    order by recentness desc
    

    出力:

    parent
    7
    

    [編集:より柔軟で将来性がある] :

    with find_parent(node_group, parent, child_of, recentness) as
    (
        select node, node, child_of, 0
        from stack_overflow
        where node in (5,9)
        union all
        select fp.node_group, i.node, i.child_of, fp.recentness + 1
        from stack_overflow i
        join find_parent fp on i.node = fp.child_of
    )
    select q.node_group as to_find, parent as found 
    from find_parent q 
    join
    (
        select node_group, max(recentness) as answer
        from find_parent
        group by node_group 
    ) as ans on q.node_group = ans.node_group and q.recentness = ans.answer 
    order by to_find    
    

    出力:

    to_find     found
    5           1
    9           7
    

    Postgres を使用している場合 、上記のコードは次のように短縮できます:

    with recursive find_parent(node_group, parent, child_of, recentness) as
    (
        select node, node, child_of, 0
        from stack_overflow
        where node in (5,9)
        union all
        select fp.node_group, i.node, i.child_of, fp.recentness + 1
        from stack_overflow i
        join find_parent fp on i.node = fp.child_of
    )
    select distinct on (node_group) node_group as to_find, parent as found 
    from find_parent 
    order by to_find, recentness desc
    

    岩の上ではっきりと! :-)



    1. PostgreSQLインデックスとInnoDBインデックス-違いを理解する

    2. 不正なハンドシェイクまたはECONNRESETAzureMysql Nodejs

    3. PDOパラメーター化ステートメントを使用してMYSQLテーブルを作成できますか?

    4. DBリクエストをインターセプトする方法は? (MySQL)