0

以下は私のテーブルです

PARTY
ID, PARTY_ID, PARENT_ID

PARTY_PARTY
BUYER_ID, SUPPLIER_ID

PARTYテーブルには、バイヤーとサプライヤーの両方のレコードが保持されます。バイヤーには 1 人以上の子バイヤー (子バイヤーごとにPARENT_ID列で参照) があり、それらの子バイヤーは順番に子バイヤーを持つことができます。

各バイヤーは 1 つ以上のサプライヤーを持つこともでき、この関連付けはPARTY_PARTYテーブルで追跡されます。BUYER_ID列にはバイヤー ID が保持され、SUPPLIER_ID列にはサプライヤー ID が保持されます。

このように、特定のバイヤーのすべてのバイヤーとサプライヤーを取得できます

特定のバイヤーのすべての階層バイヤーを取得する

SELECT ID FROM party START WITH party_id = 'BUYERX' CONNECT BY PRIOR ID = parent_id;

上記のバイヤーのすべてのサプライヤーを取得する

SELECT ID
        FROM party
        WHERE ID IN (
                SELECT SUPPLIER_ID
                FROM party_party
                WHERE BUYER_ID IN (
                        SELECT ID
                        FROM party START WITH party_id = 'BUYERX' CONNECT BY PRIOR ID = parent_id
                        )
                )

しかし、ここでの問題は、結果のサプライヤーが別のサプライヤーのバイヤーとして行動できることです。その場合、バイヤーにはバイヤーとバイヤーとして機能するサプライヤーの両方が含まれる、すべてのバイヤーとサプライヤーを取得するにはどうすればよいですか。

ビューもプロシージャも使いたくない!

サンプルデータ

PARTY
ID, PARTY_ID, PARENT_ID
1, BX, NULL
2, BY, 1
3, BZ, 1
4, SA, NULL
5, SB, NULL
6, SC, NULL
7, SD, NULL
8, SE, NULL
9, SF, NULL

PARTY_PARTY
BUYER_ID, SUPPLIER_ID
1, 4
2, 5
3, 6
6, 7
6, 8
8, 9
4

2 に答える 2