【问题标题】:Get hierarchical categories of a parent category获取父类别的层次类别
【发布时间】:2013-11-25 16:01:05
【问题描述】:

我需要一个查询来选择具有给定父 ID 的所有子类别。我的表格如下所示:

|ID | Title | Description | ParentId
--------------------------------------
 1  | Games | ...         | NULL

等等..

是否可以通过 sql-query 解决这个问题?

给我游戏类别的所有子类别..

所有子类别可以有更多的子类别等等..

我的网站菜单需要这个来列出产品。
我的尝试 使用 CocoDb 去吧

;WITH parent 
  AS ( SELECT ParentId 
       FROM [CocoDb].[dbo].[Categories] 
       WHERE Id = 11 ) 
,tree AS ( SELECT x.ParentId, x.Id 
           FROM [CocoDb].[dbo].[Categories] x 
                 INNER JOIN [CocoDb].[dbo].[Categories] ON x.Id = 11
            UNION ALL 
           SELECT y.Id, y.ParentId FROM [CocoDb].[dbo].[Categories] y 
             INNER JOIN [CocoDb].[dbo].[Categories] t ON y.Id = t.ParentId )

解决方案:

;WITH parent 
  AS ( SELECT ParentId, Title, Id 
       FROM [CocoDb].[dbo].[Categories] 
       WHERE Id = 1
      ) 
,tree AS ( 
           SELECT x.ParentId, x.Id, x.Title 
           FROM [CocoDb].[dbo].[Categories] x 
                 INNER JOIN parent ON x.ParentId = parent.Id
           UNION ALL 
           SELECT y.ParentId, y.Id, y.Title 
           FROM [CocoDb].[dbo].[Categories] y 
            INNER JOIN tree t ON y.ParentId = t.Id 
          )
SELECT *
FROM Tree

【问题讨论】:

标签: sql sql-server hierarchical-data


【解决方案1】:
;WITH parent AS 
    (
    SELECT Parent
    FROM Table1
    WHERE Child = @p0
    )    
,tree AS 
    (
    SELECT x.Parent, x.Child
    FROM Table1 x
    INNER JOIN parent ON x.Parent = parent.Parent
    UNION ALL
    SELECT y.Parent, y.Child
    FROM Table1 y
    INNER JOIN tree t ON y.Parent = t.Child
    )
      SELECT Parent, Child
      FROM tree

为您的查询更新

;WITH parent 
  AS ( SELECT ParentId 
       FROM [CocoDb].[dbo].[Categories] 
       WHERE Id = 11 
      ) 
,tree AS ( 
           SELECT x.ParentId, x.Id 
           FROM [CocoDb].[dbo].[Categories] x 
                 INNER JOIN parent ON x.ParentId = parent.ParentId
           UNION ALL 
           SELECT y.ParentId, y.Id 
           FROM [CocoDb].[dbo].[Categories] y 
            INNER JOIN tree t ON y.ParentId = t.Id 
          )
SELECT parent, Child 
FROM Tree

请确保在WITH 之前使用;,就像我在上述查询中使用的那样。

【讨论】:

  • @Patrik test here 它适用于此数据 sqlfiddle.com/#!3/3cb21/1 ,假设您正在寻找 ID = 2 的 Parent 的子树
  • 更新您的问题,以便每个人都可以阅读 cmets 部分中很难阅读的问题。
  • 嘿,回答问题
  • parent.Parent 未知.. :-/ INNER JOIN [CocoDb].[dbo].[Categories] ON x.Id = parent.ParentId
  • 它不是实际的(硬编码)parent.id,而是来自第一个 Cte 的父 ID,我称之为“父级”,我在此解决方案中有两个 CTE 一个名为“父级”,另一个名为“树”,只需执行我在更新答案中输入的查询,就应该返回在第一个父 CTE 中传递的任何父 ID 的所有子记录。
【解决方案2】:
SELECT C.*
FROM <TABLE> C INNER JOIN <TABLE> P
ON P.ID=C.PARENTID
WHERE PARENTID=<GIVEN PARENTID>

【讨论】:

    猜你喜欢
    • 2020-12-06
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多