使用SQL-Oracle获取分层数据
下面是我的桌子使用SQL-Oracle获取分层数据,sql,oracle,Sql,Oracle,下面是我的桌子 PARTY ID, PARTY_ID, PARENT_ID PARTY_PARTY BUYER_ID, SUPPLIER_ID 一方表保存了买方和供应商的记录。买方将有一个或多个子买方(由子买方的父/母ID列引用),这些子买方可以依次有子买方 每个买家也可以有一个或多个供应商,此关联在PARTY\u PARTY表中跟踪,其中买家ID列保存买家ID,供应商ID列保存其供应商ID 我能够得到所有买家和供应商的给定买家这样 获取给定买家的所有分级买家 SELECT ID FROM
PARTY
ID, PARTY_ID, PARENT_ID
PARTY_PARTY
BUYER_ID, SUPPLIER_ID
一方
表保存了买方和供应商的记录。买方将有一个或多个子买方(由子买方的父/母ID列引用),这些子买方可以依次有子买方
每个买家也可以有一个或多个供应商,此关联在PARTY\u PARTY
表中跟踪,其中买家ID
列保存买家ID,供应商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
如果你能提供样本数据,那就容易多了。如果我正确理解了买家、供应商和家长之间的关系,您可以尝试以下解决方案:
WITH
party AS (
SELECT 1 AS id, 'BUYERX' AS party_id, NULL AS parent_id FROM dual
UNION SELECT 2 AS id, 'B02' AS party_id, 1 AS parent_id FROM dual
UNION SELECT 3 AS id, 'B03' AS party_id, 1 AS parent_id FROM dual
UNION SELECT 4 AS id, 'B04' AS party_id, 2 AS parent_id FROM dual
UNION SELECT 5 AS id, 'B05' AS party_id, 3 AS parent_id FROM dual
),
party_party AS (
SELECT 2 AS buyer_id, 5 AS supplier_id FROM dual
UNION SELECT 1 AS buyer_id, 4 AS supplier_id FROM dual
)
SELECT
id, LPAD(' ', (level - 1) * 2) || party_id AS party_id, parent_id, level
FROM (
SELECT id, party_id, parent_id
FROM party
UNION ALL
SELECT supplier_id AS id, 'Supplier' AS party_id, buyer_id AS parent_id
FROM party_party
)
START WITH party_id = 'BUYERX'
CONNECT BY PRIOR id = parent_id
;
输出:
ID PARTY_ID PARENT_ID LEVEL
----- -------------- --------- -----
1 BUYERX 1
2 B02 1 2
4 B04 2 3
5 Supplier 2 3
3 B03 1 2
5 B05 3 3
4 Supplier 1 2
ID参与方\u ID父级\u ID级别
----- -------------- --------- -----
1买方x 1
2 B02 1 2
4 B04 2 3
5供应商2 3
3 B03 1 2
5 B05 3
4供应商1 2
编辑对于示例数据,我的查询将返回以下输出:
ID PARTY_ID PARENT_ID LEVEL
---- ------------------ --------- -----
1 BX 1
2 BY 1 2
5 Supplier 2 3
3 BZ 1 2
6 Supplier 3 3
7 Supplier 6 4
8 Supplier 6 4
9 Supplier 8 5
4 Supplier 1 2
ID参与方\u ID父级\u ID级别
---- ------------------ --------- -----
1 Bx1
2乘12
5供应商2 3
3 BZ 1 2
6供应商3 3
7供应商6 4
8供应商6 4
9供应商8 5
4供应商1 2这里还有一种方法,没有连接方式:
WITH
party AS (
SELECT 1 AS id, 'BUYERX' AS party_id NULL AS parent_id FROM dual
UNION SELECT 2 AS id, 'B02' AS party_id, 1 AS parent_id FROM dual
UNION SELECT 3 AS id, 'B03' AS party_id, 1 AS parent_id FROM dual
UNION SELECT 4 AS id, 'B04' AS party_id, 2 AS parent_id FROM dual
UNION SELECT 5 AS id, 'B05' AS party_id, 3 AS parent_id FROM dual
),
party_party AS (
SELECT 2 AS buyer_id, 5 AS supplier_id FROM dual
UNION SELECT 1 AS buyer_id, 4 AS supplier_id FROM dual
),
merged(id,party_id,parent_id)as(
SELECT id, party_id, parent_id
FROM party
UNION ALL
SELECT supplier_id AS id, 'Supplier' AS party_id, buyer_id AS parent_id
FROM party_party),
grouped(par,node,clevel,client)as(
select parent_id,id,1,party_id from merged where parent_id is null union all
select c.parent_id,c.id,s.clevel+1,lpad(' ',4*s.clevel)||c.party_id
from merged c
join grouped s on s.node=c.parent_id)
select * from grouped order by par nulls first,clevel,node
@Kruglej-添加的样本data@Pokuri你能不能加上预期的结果。。。你试过我的解决方案吗?有任何反馈吗?请查看我编辑的答案,以检查我对您的样本数据的查询输出是否符合您的预期。