sql - 你能帮我写两个表的递归查询吗?
问题描述
我需要编写递归查询来查找此表中的所有子节点。
例如,我需要找到 ParentManagerTaskId = 6 的所有子 ExecutorTasks
ManagerTasks
{
Id,
ParentExecutorTaskId
}
ExecutorTasks
{
Id,
ParentManagerTaskId
}
;WITH query AS
(
SELECT et.Id,et.ParentManagerTaskId,mt.ParentExecutorTaskId
FROM [Planning.ExecutorTasks] et
left outer join [Planning.ManagerTasks] mt on et.ParentManagerTaskId=mt.Id
WHERE mt.Id = 6
UNION ALL
SELECT q.Id, q.ParentManagerTaskId,et.Id
FROM [Planning.ExecutorTasks] et
JOIN query q ON et.Id = q.Id
)
SELECT *
FROM query
解决方案
您的模型有点误导,因为您有 2 个相互关联的表,并且您只想显示其中的记录。这意味着您必须在递归部分执行 2 次连接才能获得相关实体的子实体。
尝试以下方法:
;WITH Recursion AS
(
-- Anchor
SELECT
ExecutorTaskId = E.Id,
RecursionLevel = 0
FROM
[Planning.ExecutorTasks] AS E
WHERE
E.ParentManagerTaskId = 6
UNION ALL
-- Further childs
SELECT
ExecutorTaskId = E.Id,
RecursionLevel = R.RecursionLevel + 1
FROM
Recursion AS R
INNER JOIN [Planning.ManagerTasks] AS M ON R.ExecutorTaskId = M.ParentExecutorTaskId
INNER JOIN [Planning.ExecutorTasks] AS E ON M.Id = E.ParentManagerTaskId
)
SELECT
R.RecursionLevel,
R.ExecutorTaskId
FROM
Recursion AS R
ORDER BY
R.RecursionLevel,
R.ExecutorTaskId
如果您不提供示例值、预期结果和表格的 DDL,我无法测试。
推荐阅读
- email - 启动 Viber 并在桌面应用程序中发送带有链接、电子邮件、批处理的消息
- javascript - JavaScript 练习逻辑运算符(不起作用)
- python - 对 numpy 数组子类的操作的不需要的包装结果
- react-native - 一种形式,但不同的状态
- javascript - 如何获取 AnimatedInterpolation 的值
- linux - 如果 ping 成功,Linux shell (sh) CLI 测试
- java - Kotlin:将日期字符串转换为 ISO 字符串
- r - 通过保持指标变量从年份数据创建月度数据
- oracle - 将 HIVE 数据库复制到 Oracle
- wpf - 高度和宽度改变后,WPF MVVM在屏幕上重新居中应用程序?