【问题标题】:Linking together different columns in a SQL table?将 SQL 表中的不同列链接在一​​起?
【发布时间】:2014-05-30 01:35:30
【问题描述】:

我对高级 SQL 查询不是很有经验,我熟悉基本语句和基本连接,目前正试图弄清楚如何编写一个似乎超出我的深度并且我无法做到的查询到目前为止从谷歌找到一个解决方案,我希望有人能指出我正确的方向。

我正在使用的表有一个 ID 列和一个“父 ID”列。

我正在寻找 ID 为“1”的所有后代 - 父 ID 为“1”的行,父 ID 等于父 ID 为“1”的任何行 ID 的行等。目前我已经一直手动执行此操作,但到目前为止有数百个后代,我觉得有一种方法可以将其放入一个查询中。

任何帮助将不胜感激,如果不清楚,我也可以尝试澄清。

编辑 - 我使用以下查询:

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

【问题讨论】:

  • 您使用的是什么数据库?您正在寻找的是递归查询(通常使用递归 CTE 实现),但并非所有数据库都支持此功能。
  • 这是一个 SQL 数据库。我不确定这是否是您正在寻找的答案。使用 SQL Server 管理工作室。如果我可以进一步澄清,请告诉我。
  • Corey:SQL 只是 查询语言 - 不是数据库产品。您使用的是 (Microsoft) SQL Server - 使用 sql-server 标记来表明这一点! (我已经为你添加了这个)

标签: sql sql-server database join


【解决方案1】:

听起来可以通过公用表表达式来实现:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多