我对高级SQL查询不是很熟悉,我熟悉基本语句和基本联接,目前正试图弄清楚如何编写一个似乎超出我的深度的查询而且我无法进行到目前为止从谷歌找到解决方案,我希望有人能够指出我正确的方向。
我正在使用的表格有一个ID列和一个“父ID”列。
我正在寻找ID为'1'的所有后代 - 父ID为'1'的行,父ID等于任何行ID且父ID为'1'的行等。目前我已经一直在手动执行此操作但到目前为止有数百个后代,我觉得有一种方法可以将其放入一个查询中。
如果不清楚我还可以尝试澄清任何帮助。
编辑 - 我使用以下查询:
with cteMappings as (
select map_id, parent_map_id, map_name
from admin_map
where map_id = '1'
union all
select a.map_id, a.parent_map_id, a.map_name
from admin_map a
inner join cteMappings m
on a.parent_map_id = m.map_id
)
select map_id, parent_map_id, map_name
from cteMappings
答案 0 :(得分:1)
听起来可以通过Common Table Expression实现:
DECLARE @temp TABLE (id INT IDENTITY(1, 1), parent_id INT);
INSERT @temp
SELECT NULL
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT NULL
SELECT * FROM @temp
; WITH HierarchyTemp (id, parent_id, depth) AS (
SELECT id, parent_id, 0
FROM @temp
WHERE id = 1
UNION ALL
SELECT t.id, t.parent_id, ht.depth + 1
FROM @temp t
INNER JOIN HierarchyTemp ht ON ht.id = t.parent_id
)
SELECT *
FROM HierarchyTemp
所以上面的例子是创建一个包含4行的表变量:
id parent_id
1 NULL
2 1
3 2
4 NULL
id'1'的后代结果(也包括其自身,但可以通过附加的WHERE子句排除):
id parent_id depth
1 NULL 0
2 1 1
3 2 2