【问题标题】:SQL Query to extract nesting from a table从表中提取嵌套的 SQL 查询
【发布时间】:2018-04-15 22:15:44
【问题描述】:

我有一张表,其中引用从一行到另一行。所以基本上是这样的:

ID | Name | ParentId
1  | Root | 
2  | Top  |  
3  | Sub1 | 1
4  | Sub2 | 2

第三列 [ParentId] 表示当前行的父级。 我的问题是如何使用 SQL 查询从表中获取此嵌套。 我想从查询中看到的结果是

ID | Name | ParentName
1  | Root | NULL
2  | Top  | NULL
3  | Sub1 | Root
4  | Sub2 | Top

这似乎微不足道,因为它只是将第三列的 id 替换为项目的名称,但我似乎无法弄清楚。 感谢您的帮助!

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    对于单个级别,您可以在同一张表上使用左连接

    select a.id, a.name, b.name 
    from my_table a  
    left join my_table b on b.parentId = a.id 
    

    【讨论】:

      【解决方案2】:
      select t1.id, t1.name, t2.name as parentName
      from  table t1
      left join  table t2
      on t2.id = t1.parentId
      

      【讨论】:

        【解决方案3】:

        以下查询将帮助您实现目标:

        SELECT
            t1.Id,
            t1.Name,
            (SELECT t2.Name FROM MyTable t2 WHERE t2.Id = t1.ParentId) ParentName 
        FROM
            MyTable t1
        

        如果表中有很多记录,通过在ParentId 列上创建索引,您可以比JOIN 更快地运行上述查询。

        【讨论】:

          【解决方案4】:

          SQL 小提琴:hierarchyid example fiddles

          我决定采用一种稍微不同的方法来回答这个问题,使用 SQL Server 本身支持的 hierarchyid 数据类型。 hierarchyid 是专门为嵌套关系处理记录选择/查询功能而创建的,一旦您习惯了数据类型带来的一些小麻烦(例如内联查询/子查询,它们通常需要到达实际 id创纪录的价值),它实际上非常漂亮。

          我创建了一个 SQL fiddle,逐步展示了如何使用数据类型的示例嵌套关系:

          /Category One
              /Subcategory 1
                  /Subcategory 1.1
                  /Subcategory 1.2
                  /Subcategory 1.3
              /Subcategory 2
              /Subcategory 3
                  /Subcategory 3.1
                      /Subcategory 3.1.1
              /Subcategory 4
          /Category Two
              /Subcategory 1
          

          注意:tsql 被重写和注释的 MSDN 示例代码,实际上是 imo 做得很差。我已经重写并以这样一种方式呈现它,我发现它更容易让我的头绕起来。

          【讨论】:

            【解决方案5】:

            所有建议的解决方案都适用于发布的问题。在我的“真实”情况下,该表要复杂得多,并且已经有许多 APPLY 语句(我猜是特定的 SQL Server),所以我最终使用了已发布 Join 语句的“外部应用”变体: With a AS ( SELECT id, name from Nesting )
            SELECT id, name, ParentName from a OUTER APPLY ( SELECT name as ParentName from Nesting n where n.parentid = a.id
            ) AS FOO

            非常感谢大家!

            【讨论】:

              猜你喜欢
              • 2023-02-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-08-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多