【问题标题】:SQL query for parent-child chain父子链的SQL查询
【发布时间】:2010-11-15 20:18:25
【问题描述】:

我有一个表,可以将表中的另一个成员作为父级引用。该父级也可以将另一行称为其父级...等等。

id     col1     col2    parentID
1      foo      bar       NULL
2      blah     boo       1
3      fob      far       2
4      wob      lob       NULL

我想返回给定 id 的链。因此,如果 id 为 3,我将返回第 3 行、第 2 行和第 1 行。如果 id 为 2,我将返回第 2 行和第 1 行。如果 id 为 1 或 4,我将返回该行。

谢谢

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql hierarchical-data


    【解决方案1】:

    使用recursive CTE

    DECLARE @id INT
        SET @id = 3
    
    ;WITH hierarchy AS (
      SELECT t.id, t.parentid
        FROM YOUR_TABLE t
       WHERE t.id = @id
     UNION ALL
     SELECT x.id, x.parentid
       FROM YOUR_TABLE x
       JOIN hierarchy h ON h.parentid = x.id)
    SELECT h.id
      FROM hierarchy h
    

    结果:

    id
    ---
    3
    2
    1
    

    【讨论】:

      【解决方案2】:

      给你

      SELECT P.cat_id AS parent_cat_id, P.parent_id AS ROOT, P.cat_name AS parent_cat_name, C.parent_id, C.cat_id, C.cat_name FROM categories AS P LEFT OUTER JOIN categories AS C ON C.parent_id=P.cat_id WHERE P.parent_id IS NULL ORDER BY parent_cat_name, cat_name
      

      【讨论】:

      • 它的 koool :),这样一个很好的查询,但我认为它是为三层结构设计的?
      【解决方案3】:

      如果您使用递归 CTE,请不要忘记添加

      h.parentid <> x.id
      

      关于你的加入

      JOIN hierarchy h ON h.parentid = x.id)
      

      否则你将只是一个最大递归-错误,因为它循环

      【讨论】:

        【解决方案4】:
        WITH Hierarchy(ChildId, ChildName, Generation, ParentId)
        AS
        (
            SELECT Id, Name, 0, ParentId
                FROM UserType AS FirtGeneration
                WHERE ParentId IS NULL        
            UNION ALL
            SELECT NextGeneration.Id, NextGeneration.Name, Parent.Generation + 1, Parent.ChildId
        
                FROM UserType AS NextGeneration
                INNER JOIN Hierarchy AS Parent ON NextGeneration.ParentId = Parent.ChildId    
        )
        SELECT *
            FROM Hierarchy
            OPTION(MAXRECURSION 32767)
        

        【讨论】:

          猜你喜欢
          • 2010-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多