sql - 在表中查找所有父母或孩子
问题描述
我有如下表:
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 中返回所有相关值的查询或过程,例如,如果用户输入 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 的父母和孩子,就像标题所暗示的那样,而是寻找包括所有兄弟姐妹在内的整个家谱。您希望结果中的 ID 33 既不是 ID 9 的父级也不是子级,但 ID 9 和 ID 33 都具有相同的父 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
推荐阅读
- python - 如何为 Selenium (Python) 中的下拉列表指定正确的 xpath / css 选择器
- javascript - Apache Echarts 和 Vue-ECharts - 饼图动画在加载时不起作用
- ios - pod AF Networking text/html ContentTypes 问题
- azure - 将保存的 KQL 查询从 ARM 模板导入 Azure Log Analytics
- c# - 在 LINQ 查询中使用表达式
- mysql - MySQL - 如何使用 SUM() 并排除 = 0 的 SUM() 结果
- javafx - Java Fx 将 IntegerProperties 数组绑定到多个列
- c++ - std::async 与线程
- sql - 在 Bigquery 中使用 Date_Diff 为用户创建保留标志
- qt-designer - 如何在 Qt QLabel 上防止剪辑?