以下は私のテーブルです
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