sql - Sql Server 2014 - 深度递归父子自加入
问题描述
我正在尝试构建一个深度递归自联接查询。有这样的表:
Id | ParentId
1 | NULL
2 | 1
3 | 1
4 | 2
5 | 3
6 | 8
7 | 9
对于 ID 1,我的查询应该获取 1、2、3、4、5,因为它们要么是 1 的孩子,要么是 1 的孩子的孩子。在给定的示例中,6 和 7 不应包含在查询结果中。
我尝试使用 CTE,但我得到了大量的重复项:
WITH CTE AS (
SELECT Id, ParentId
FROM dbo.Table
WHERE ParentId IS NULL
UNION ALL
SELECT t.Id, t.ParentId
FROM dbo.Table t
INNER JOIN CTE c ON t.ParentId = c.Id
)
SELECT * FROM CTE
想法?
解决方案
您可以尝试使用DISTINCT
来过滤重复的行。
;WITH CTE AS (
SELECT Id, ParentId
FROM T
WHERE ParentId IS NULL
UNION ALL
SELECT t.Id, t.ParentId
FROM T
INNER JOIN CTE c ON t.ParentId = c.Id
)
SELECT DISTINCT Id, ParentId
FROM CTE
推荐阅读
- ckeditor5 - 如何将光标移动到ckeditor5中的文本末尾
- jmeter - Jmeter for loop http请求 - 并行
- object - 想在任何地方自动选择特定窗口(对象克隆) 11.2
- android - 在 webview 上隐藏本机 textSelectHandleLeft:Android
- yii2 - yii2 作曲家更新上的“UnexpectedValueException”
- c++ - 表示日期的字符串并对其进行转换
- javascript - 如何正确使用 Three.js FBXLoader?
- swift - 全局禁用某些方法上的 SwiftLint multiline_arguments
- java - 严重:GET 的异步超时 [使用 Spring MVC 4.3.x、Java 8、Tomcat 7 流式传输大量数据]
- firebase - 将文件上传到 Firebase 云存储时出错:“rules_version = 1 不允许列出存储桶中的对象”