将SQL表中的不同列链接在一​​起?

时间:2014-05-30 01:35:31

标签: sql sql-server database join

我对高级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

1 个答案:

答案 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