我正在尝试建立一个递归查询,但遇到了问题。
请在我的数据集下面找到
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
谢谢
不确定您为什么要递归查询?看来您可以只使用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
递归WITH子句查询产生了一个循环,并为了避免无限循环而将其停止。
此问题是由于数据库中的数据错误所致。有一些记录在它们之间造成循环关系,从而导致无限循环。
例如:P是C的父级,而C再次是P的父级。
您可以使用UNION ALL和表的连接简单地获取上述输出。