查找 table 中的所有父项或子项
find all parent or child in table
我有 table 如下所示:
parent_id
child_id
2
5
3
9
3
5
8
9
8
33
8
18
8
17
9
22
22
4
22
11
38
9
我想要 sql 中的查询或过程 return 所有与 ID 相关的值(直接或间接)
例如,如果用户输入 9
输出是:
38,8,3,22,9,17,33,18,5,11,4
我当前的查询是:
Formatted on 9/15/9091 9:59:59 AM (QP5 v5.390) */
WITH
Parents
AS
(SELECT YT.child_id, YT.PARENT_ID
FROM ARTAPAY_TEMP.REL_TEST YT
WHERE YT.child_id = 6
UNION ALL
SELECT YT.CHILD_ID, YT.PARENT_ID
FROM ARTAPAY_TEMP.REL_TEST P
JOIN ARTAPAY_TEMP.REL_TEST YT ON P.PARENT_ID = YT.CHILD_ID),
Children
AS
(SELECT YT.CHILD_ID, YT.PARENT_ID
FROM ARTAPAY_TEMP.REL_TEST YT
WHERE YT.CHILD_ID = 6
UNION ALL
SELECT YT.CHILD_ID, YT.PARENT_ID
FROM ARTAPAY_TEMP.REL_TEST C
JOIN ARTAPAY_TEMP.REL_TEST YT ON C.CHILD_ID = YT.PARENT_ID)
SELECT child_id, Parent_ID
FROM Parents P
UNION ALL
SELECT child_ID, Parent_ID
fROM Children C
WHERE C.child_ID != 6
首先你的查询不是递归的。在递归 CTE 中,查询引用自身,例如with cte (x) as (select x from t union all select x + 1 from **cte** join t on t.x = cte.x + 1
.
那么你不是在寻找一个ID的parents和children,正如标题所暗示的那样,而是在寻找包括所有兄弟姐妹在内的整个家谱。您希望结果中的 ID 33 既不是 parent 也不是 child 到 ID 9,但 ID 9 和 ID 33 具有相同的 parent ID 8.
with cte (id) as
(
select parent_id from mytable where 9 in (child_id, parent_id)
union all
select case when c.id = t.parent_id then t.child_id else t.parent_id end
from mytable t
join cte c on c.id in (t.child_id, t.parent_id)
)
cycle id set is_cycle to 1 default 0
select distinct id from cte;
演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=8e4ec2500ffbfcc886a15635dfa66d6d
我有 table 如下所示:
parent_id | child_id |
---|---|
2 | 5 |
3 | 9 |
3 | 5 |
8 | 9 |
8 | 33 |
8 | 18 |
8 | 17 |
9 | 22 |
22 | 4 |
22 | 11 |
38 | 9 |
我想要 sql 中的查询或过程 return 所有与 ID 相关的值(直接或间接) 例如,如果用户输入 9 输出是: 38,8,3,22,9,17,33,18,5,11,4
我当前的查询是:
Formatted on 9/15/9091 9:59:59 AM (QP5 v5.390) */
WITH
Parents
AS
(SELECT YT.child_id, YT.PARENT_ID
FROM ARTAPAY_TEMP.REL_TEST YT
WHERE YT.child_id = 6
UNION ALL
SELECT YT.CHILD_ID, YT.PARENT_ID
FROM ARTAPAY_TEMP.REL_TEST P
JOIN ARTAPAY_TEMP.REL_TEST YT ON P.PARENT_ID = YT.CHILD_ID),
Children
AS
(SELECT YT.CHILD_ID, YT.PARENT_ID
FROM ARTAPAY_TEMP.REL_TEST YT
WHERE YT.CHILD_ID = 6
UNION ALL
SELECT YT.CHILD_ID, YT.PARENT_ID
FROM ARTAPAY_TEMP.REL_TEST C
JOIN ARTAPAY_TEMP.REL_TEST YT ON C.CHILD_ID = YT.PARENT_ID)
SELECT child_id, Parent_ID
FROM Parents P
UNION ALL
SELECT child_ID, Parent_ID
fROM Children C
WHERE C.child_ID != 6
首先你的查询不是递归的。在递归 CTE 中,查询引用自身,例如with cte (x) as (select x from t union all select x + 1 from **cte** join t on t.x = cte.x + 1
.
那么你不是在寻找一个ID的parents和children,正如标题所暗示的那样,而是在寻找包括所有兄弟姐妹在内的整个家谱。您希望结果中的 ID 33 既不是 parent 也不是 child 到 ID 9,但 ID 9 和 ID 33 具有相同的 parent ID 8.
with cte (id) as
(
select parent_id from mytable where 9 in (child_id, parent_id)
union all
select case when c.id = t.parent_id then t.child_id else t.parent_id end
from mytable t
join cte c on c.id in (t.child_id, t.parent_id)
)
cycle id set is_cycle to 1 default 0
select distinct id from cte;
演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=8e4ec2500ffbfcc886a15635dfa66d6d