3

この回答では、すべてのサブノードを取得する方法と、ルート ノードへの参照を取得する方法を尋ねました。今、私は逆も必要であることに気づきました:

すべてのノードとすべての親が必要です。

したがって、この単純なツリーでは:

1 - 2 - 3

    L - 4 - 5

        L - 6

7 - 8

私はを頂きたい

1 1;
2 2;
2 1;
3 3;
3 2;
3 1;
4 4;
4 2;
4 1;
5 5;
5 4;
5 2;
5 1;
6 6;
6 4;
6 2;
6 1;
7 7;
8 8;
8 7;

(順番は関係ありません)

これは逆を取得するためのクエリでした (親からすべての子を取得します)。私はそれで遊んでみましたが、解決策を見つけることができませんでした。提案していただけますか?

-- get all childs of all parents
WITH    q AS
        (
        SELECT  ID_CUSTOMER, ID_CUSTOMER AS root_customer
        FROM    CUSTOMERS c
        UNION ALL
        SELECT  c.ID_CUSTOMER, q.root_customer
        FROM    q
        JOIN    CUSTOMERS c 
        ON      c.ID_PARENT_CUSTOMER = q.ID_CUSTOMER
        )
SELECT  *
FROM    q
4

2 に答える 2

3

このクエリはtransitive closure、隣接リスト (すべての祖先と子孫のペアのリスト) を作成します。

すべての祖先のすべての子孫が返されるため、その逆も当てはまります。つまり、各子孫に対してすべての祖先が返されます。

したがって、このクエリは、トラバーサルの順序に関係なく、すべての可能な組み合わせを返します。親から子への接続であるか、その逆であるかは問題ではありません。

テストしてみましょう:

WITH    customers (id_customer, id_parent_customer) AS
        (
        SELECT  *
        FROM    (
                VALUES  (1, NULL),
                        (2, 1),
                        (3, 2),
                        (4, 2),
                        (5, 4),
                        (6, 4),
                        (7, NULL),
                        (8, 7)
                ) t (a, b)
        ),
        q AS
        (
        SELECT  ID_CUSTOMER, ID_CUSTOMER AS root_customer
        FROM    CUSTOMERS c
        UNION ALL
        SELECT  c.ID_CUSTOMER, q.root_customer
        FROM    q
        JOIN    CUSTOMERS c 
        ON      c.ID_PARENT_CUSTOMER = q.ID_CUSTOMER
        )
SELECT  *
FROM    q
ORDER BY
        id_customer, root_customer DESC
于 2011-04-19T13:34:32.917 に答える
0
with q (
select id_customer, id_parent_customer from customers
union all
select id_customer, id_parent_customer from customers
join q on customers.id_parent_customer = q.id_customer
) select * from q
于 2011-04-19T13:24:44.377 に答える