sql-server - SQL Server : Select Parent-Child

标签 sql-server sql-server-2008 hierarchical-data recursive-cte

我有 SQL Server 2008,其中有一个名为 ProductCategories 的表,设计如下:

Id | Name      | ParentId
71   PCs         NULL
32   MACs        NULL
 3   Keyboard    1
 9   Mouse       1
 5   Screen      1
11   Keyboard    2
 7   Mouse       2
 8   Screen      2

我想从此表中进行选择,并获得如下结果集:

Id | Name      | ParentId
71   PCs         NULL
 3   Keyboard    1
 9   Mouse       1
 5   Screen      1
32   MACs        NULL
11   Keyboard    2
 7   Mouse       2
 8   Screen      2

我尝试了这个,但这显然首先给了我那些没有 ParentId 的:

WITH Hierarchy
AS
(
    SELECT 
        T1.Id, T1.ParentId
    FROM
        ProductCategories T1
    WHERE 
        T1.parentid IS NULL OR 
        T1.parentid IN (SELECT id from ProductCategories WHERE parentid IS NULL)
    UNION ALL
    SELECT 
        T1.Id, T1.ParentId
    FROM
        ProductCategories T1
    INNER JOIN 
        Hierarchy TH ON TH.Id = T1.ParentId
)
select *
from Hierarchy 
order by parentid

如果可以的话请帮助我:)

-- 不懂 SQL 的人

最佳答案

试试这个:

Select Id, Name, ParentId
From ProductCategories
Order By Coalesce(ParentId, Id), 
   Coalesce(ParentId, 0), Name

三个 Order By 谓词,

  1. Coalesce(ParentId, Id):此方法按父项对记录进行分组,包括父项本身和该父项的所有子项
  2. Coalesce(ParentId, 0) 在每个集合中进行分组,以便父级为空的一条记录排序到组内的顶部
  3. 名称,按名称对组内的子项进行排序

关于sql-server - SQL Server : Select Parent-Child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1399708/

相关文章:

sql-server - 检查列表是否为空或 null 然后检查 SQL

sql-server - 从存储过程的结果集中选择列

sql-server-2008 - 一个奇怪的sql server插入问题?

javascript - 将平面数组转换为分层数组

sql - 如何避免Sql查询超时

sql - 在插入和更新语句中使用 if/else

c# - 如何使用 C#、Entity Framework 和 SQL Server 2008 读取/写入地理数据?

php - MySQL自连接获取有序父子记录

mysql - MySQL 中的分层数据

sql-server - 最近的 Windows 更新后,使用 dtexec 的批处理脚本不会成功