【问题标题】:Recursive sql query in oracleoracle中的递归sql查询
【发布时间】:2019-03-06 12:05:55
【问题描述】:

表:ID1 和 ID2 是列的名称

| ID1   |   ID2 | 
| 4     |     3 |     
| 3     |     2 |   
| 2     |     1 |    
| 7     |     6 |     
| 6     |     5 |    
| 9     |     8 |    

想要的结果

| ID1   |   ID2 | 
| 4     |     1 |     
| 7     |     5 |   
| 9     |     8 | 

我需要使用 connect by 或递归 cte 为 oracle 构建递归 sql 查询。无法找出解决方案。

【问题讨论】:

  • 您使用的是什么版本的 Oracle?
  • 当前版本为 12.1

标签: sql oracle


【解决方案1】:

在这种情况下无需使用 CTE,因为您在遍历树时不进行任何累积计算。

SQL> with t(id1, id2) as
  2  (select 4,3 from dual
  3  union all select 3,2 from dual
  4  union all select 2,1 from dual
  5  union all select 7,6 from dual
  6  union all select 6,5 from dual
  7  union all select 9,8 from dual)
  8  select connect_by_root id1 id1, id2
  9    from t
 10   where connect_by_isleaf = 1
 11  start with not exists (select null from t t0 where t0.id2 = t.id1)
 12  connect by prior id2 = id1;

       ID1        ID2
---------- ----------
         4          1
         7          5
         9          8

【讨论】:

  • 非常感谢。它对我有用,但我无法理解这个解决方案
【解决方案2】:

这只是一个补充答案,没有使用从 id1 和 id2 中删除公共元素的分层查询。

     WITH t(id1, id2) 
     AS (SELECT 4, 
                3 
         FROM   dual 
         UNION ALL 
         SELECT 3, 
                2 
         FROM   dual 
         UNION ALL 
         SELECT 2, 
                1 
         FROM   dual 
         UNION ALL 
         SELECT 7, 
                6 
         FROM   dual 
         UNION ALL 
         SELECT 6, 
                5 
         FROM   dual 
         UNION ALL 
         SELECT 9, 
                8 
         FROM   dual), 
     t1 
     AS (SELECT id1 id1, 
                id1 id2 
         FROM   t), 
     t2 
     AS (SELECT id2 id1, 
                id2 id2 
         FROM   t), 
     t3 
     AS (SELECT ROWNUM row_num1, 
                id1 
         FROM   (SELECT ( t.id1 ) id1 
                 FROM   t 
                 WHERE  NOT EXISTS (SELECT NULL 
                                    FROM   t1, 
                                           t2 
                                    WHERE  ( t1.id1 = t2.id1 
                                             AND t1.id2 = t2.id2 ) 
                                           AND ( t.id1 = t1.id1 )) 
                 ORDER  BY t.id1 ASC)), 
     t4 
     AS (SELECT ROWNUM row_num1, 
                id2 
         FROM   (SELECT ( t.id2 ) id2 
                 FROM   t 
                 WHERE  NOT EXISTS (SELECT NULL 
                                    FROM   t1, 
                                           t2 
                                    WHERE  ( t1.id1 = t2.id1 
                                             AND t1.id2 = t2.id2 ) 
                                           AND ( t.id2 = t2.id2 )) 
                 ORDER  BY t.id2 ASC)) 
SELECT a.id1, 
       b.id2 
FROM   t3 a, 
       t4 b 
WHERE  a.row_num1 = b.row_num1 
ORDER  BY id1; 

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    相关资源
    最近更新 更多