我有两个存储过程。第一个存储过程返回顶级父级,第二个过程将返回提供的父级ID的子级。每个孩子也可能是父母。
我在研究CTE时遇到的问题是,每个例子似乎都依赖于ID + 1,因为项目的ID不是连续的,所以它不会在这里工作。这里的任何指导将不胜感激。
答案 0 :(得分:0)
这是一个快速CTE示例,演示如何确定查询中的深度。完整的SQL小提琴就在这里:http://www.sqlfiddle.com/#!6/5c3f47/1/0
WITH CTE AS (
SELECT
Records.Id,
Records.Name,
Records.ParentId,
CONVERT(INT, 1) AS Depth
FROM dbo.Records Records
WHERE Records.ParentId IS NULL
UNION ALL
SELECT
Records.Id,
Records.Name,
Records.ParentId,
CTE.Depth + 1
FROM CTE
INNER JOIN dbo.Records Records
ON CTE.Id = Records.ParentId
)
SELECT * FROM CTE
对于该示例,产生以下输出:
| ID | NAME | PARENTID | DEPTH |
|----|-------|----------|-------|
| 1 | A | (null) | 1 |
| 2 | B | (null) | 1 |
| 5 | B.1 | 2 | 2 |
| 3 | A.1 | 1 | 2 |
| 4 | A.2 | 1 | 2 |
| 6 | A.1.1 | 3 | 3 |
| 7 | A.1.2 | 3 | 3 |