ORACLE递归查询

问题描述 投票:0回答:2

我正在尝试建立一个递归查询,但遇到了问题。

请在我的数据集下面找到

WITH table1 as(
SELECT 1 as ID, 'C1' as CODE, 'LABEL_1' as LABEL from dual UNION ALL
SELECT 2 as ID, 'C2' as CODE, 'LABEL_2' as LABEL from dual UNION ALL
SELECT 3 as ID, 'C3' as CODE, 'LABEL_3' as LABEL from dual UNION ALL
SELECT 4 as ID, 'C4' as CODE, 'LABEL_4' as LABEL from dual UNION ALL
SELECT 5 as ID, 'C5' as CODE, 'LABEL_5' as LABEL from dual
),
table2 as (
SELECT 1 as ID,  1 as id_table1, 'C1_1' as CODE_CHILD,'LABEL_1_1' as LABEL_CHILD from dual UNION ALL
SELECT 2 as ID,  1 as id_table1, 'C1_2' as CODE_CHILD,'LABEL_1_2' as LABEL_CHILD from dual UNION ALL
SELECT 3 as ID,  1 as id_table1, 'C1_3' as CODE_CHILD,'LABEL_1_3' as LABEL_CHILD from dual UNION ALL
SELECT 4 as ID,  1 as id_table1, 'C1_4' as CODE_CHILD,'LABEL_1_4' as LABEL_CHILD from dual UNION ALL
SELECT 6 as ID,  3 as id_table1, 'C3_1' as CODE_CHILD,'LABEL_3_1' as LABEL_CHILD from dual UNION ALL
SELECT 7 as ID,  3 as id_table1, 'C3_2' as CODE_CHILD,'LABEL_3_2' as LABEL_CHILD from dual UNION ALL
SELECT 8 as ID,  3 as id_table1, 'C3_3' as CODE_CHILD,'LABEL_3_3' as LABEL_CHILD from dual UNION ALL
SELECT 9 as ID,  3 as id_table1, 'C3_4' as CODE_CHILD,'LABEL_3_4' as LABEL_CHILD from dual UNION ALL
SELECT 10 as ID, 5 as id_table1, 'C5_1' as CODE_CHILD,'LABEL_5_1' as LABEL_CHILD from dual
),
hierarchy as (
Select
    a.id, code, label, CODE_CHILD,id_table1
from table1     a
    left join table2 b on b.id_table1 = a.ID
    )
,recursive (base, id, code, label, CODE_CHILD,id_table1) as (
    SELECT
       id as base,
       id, 
       code, 
       label, 
       CODE_CHILD,
       id_table1
    FROM hierarchy 
UNION ALL
    SELECT
        previous_level.base,
        current_level.id,
        current_level.code, 
       current_level.label, 
       current_level.CODE_CHILD,
       current_level.id_table1
    FROM  recursive previous_level,
          hierarchy current_level
    WHERE  1=1 
            and current_level.id = previous_level.id_table1
    )
SELECT * FROM recursive order by   base;

而且我收到此错误:32044. 00000-“执行递归WITH查询时检测到循环”*原因:递归WITH子句查询产生了一个循环并被停止 为了避免无限循环。*操作:重写递归WITH查询以停止递归或使用 CYCLE子句。

我错了?

这就是我想要得到的结果

id  code    label      id_parent
1   C1      LABEL_1 
2   C2      LABEL_2 
3   C3      LABEL_3 
4   C4      LABEL_4 
5   C5      LABEL_5 
6   C1_1    LABEL_1_1   1
7   C1_2    LABEL_1_2   1
8   C1_3    LABEL_1_3   1
9   C1_4    LABEL_1_4   1
10  C3_1    LABEL_3_1   3
11  C3_2    LABEL_3_2   3
12  C3_3    LABEL_3_3   3
13  C3_4    LABEL_3_4   3
14  C5_1    LABEL_5_1   5

谢谢

oracle recursive-query
2个回答
0
投票

不确定您为什么要递归查询?看来您可以只使用UNION ALL并连接两个表:

WITH table1 ( ID, Code, Label ) as(
  SELECT 1, 'C1', 'LABEL_1' from dual UNION ALL
  SELECT 2, 'C2', 'LABEL_2' from dual UNION ALL
  SELECT 3, 'C3', 'LABEL_3' from dual UNION ALL
  SELECT 4, 'C4', 'LABEL_4' from dual UNION ALL
  SELECT 5, 'C5', 'LABEL_5' from dual
),
table2 ( ID, id_table1, code_child, label_child ) as (
  SELECT 1,  1, 'C1_1','LABEL_1_1' from dual UNION ALL
  SELECT 2,  1, 'C1_2','LABEL_1_2' from dual UNION ALL
  SELECT 3,  1, 'C1_3','LABEL_1_3' from dual UNION ALL
  SELECT 4,  1, 'C1_4','LABEL_1_4' from dual UNION ALL
  SELECT 6,  3, 'C3_1','LABEL_3_1' from dual UNION ALL
  SELECT 7,  3, 'C3_2','LABEL_3_2' from dual UNION ALL
  SELECT 8,  3, 'C3_3','LABEL_3_3' from dual UNION ALL
  SELECT 9,  3, 'C3_4','LABEL_3_4' from dual UNION ALL
  SELECT 10, 5, 'C5_1','LABEL_5_1' from dual
)
SELECT ROW_NUMBER() OVER ( ORDER BY table_no, code ) AS id,
       code,
       label,
       id_parent
FROM   (
  SELECT code,
         label,
         1 AS table_no,
         NULL AS id_parent
  FROM   table1
UNION ALL
  SELECT code_child,
         label_child,
         2 AS table_no,
         id_table1
  FROM   table2
)
order by table_no, code;

哪个输出:

ID | CODE |标签| ID_PARENT-:| :- :-------- | --------: 1 | C1 | LABEL_1 | null 2 | C2 | LABEL_2 | null 3 | C3 | LABEL_3 | null 4 | C4 | LABEL_4 | null 5 | C5 | LABEL_5 | null 6 | C1_1 | LABEL_1_1 | 1个 7 | C1_2 | LABEL_1_2 | 1个 8 | C1_3 | LABEL_1_3 | 1个 9 | C1_4 | LABEL_1_4 | 1个10 | C3_1 | LABEL_3_1 | 311 | C3_2 | LABEL_3_2 | 312 | C3_3 | LABEL_3_3 | 313 | C3_4 | LABEL_3_4 | 314 | C5_1 | LABEL_5_1 | 5

db <>小提琴here


0
投票

递归WITH子句查询产生了一个循环,并为了避免无限循环而将其停止。

此问题是由于数据库中的数据错误所致。有一些记录在它们之间造成循环关系,从而导致无限循环。

例如:P是C的父级,而C再次是P的父级。

您可以使用UNION ALL和表的连接简单地获取上述输出。

© www.soinside.com 2019 - 2024. All rights reserved.