SQL 获取所有类别和所有子类别

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

你能帮我得到所有类别和所有子类别吗?

enter image description here

数据库创建脚本

CREATE TABLE Category(Id INT NOT NULL, ParentId INT NULL)
GO
INSERT INTO Category (Id, ParentId) VALUES (1, NULL)
INSERT INTO Category (Id, ParentId) VALUES (2, 1)
INSERT INTO Category (Id, ParentId) VALUES (3, 1)
INSERT INTO Category (Id, ParentId) VALUES (4, 2)
INSERT INTO Category (Id, ParentId) VALUES (5, 2)
INSERT INTO Category (Id, ParentId) VALUES (6, 2)
GO

我尝试在 ms-sql 中使用游标技术和连接方法来解决这个问题,但可以获取所有数据。

SELECT parent.Id AS ParentId, parent.ParentId AS ChildId FROM Category parent
JOIN Category child ON parent.Id = child.Id

期待结果

ParentId    ChildId
----------- -----------
1           1
1           2
1           3
1           4
1           5
1           6
2           2
2           4
2           5
2           6
3           3
4           4
5           5
6           6

谢谢

最佳答案

WITH RCTE AS 
(
    SELECT * , Id AS TopLevelParent
    FROM dbo.Category c

    UNION ALL

    SELECT c.* , r.TopLevelParent
    FROM dbo.Category c
    INNER JOIN RCTE r ON c.ParentId = r.Id
)
SELECT 
  r.TopLevelParent AS ParentID
, r.Id AS ChildID 
FROM RCTE r
ORDER BY ParentID;

SQLFiddle DEMO

关于SQL 获取所有类别和所有子类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45501853/

相关文章:

c# - 如何将 SQL Server 过程变量设置为从 C# ASP.NET MVC 程序输入的数据?

sql-server - TFS 2013 中的报告

sql - 按天分组,在left join中显示没有数据和复杂查询的天数

mysql - 在 SQL 中查找并替换或删除部分字符串

sql - sql计数是如何工作的?

sql-server-2008 - TSQL 将总和转换为金钱

sql - 如何删除所有表中的所有外键约束?

sql - Postgres : convert array of elements to multiple rows

sql - 如何在 SQL Server 中用一个单词替换一列中的重复单词

sql-server - 如何设置新的 SQL Server 数据库以允许将来可能的复制?