Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL-Oracle获取分层数据_Sql_Oracle - Fatal编程技术网

使用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你能不能加上预期的结果。。。你试过我的解决方案吗?有任何反馈吗?请查看我编辑的答案,以检查我对您的样本数据的查询输出是否符合您的预期。