SQL 获取所有类别和所有子类别
SQL Get All Categories And All Sub Categories
你能帮我得到所有类别和所有子类别吗?
数据库创建脚本
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
谢谢
如前所述,为此您需要一个递归 CTE。使这个有点棘手的一件事是您实际上是在将 ID (int) 转换为字符数据 (-)。
我相信下面的查询会让您开始获得所需的结果。不过,这并没有考虑到您实际上想要列出所有子项,而不管他们在层次结构中的位置。
WITH CategoryTree AS
(
SELECT
ID AS CategoryID
, CAST(ID AS varchar(50)) AS CatVar
, 0 AS LeafLevel
, ParentID
FROM Category WHERE ParentID IS NULL
UNION ALL
SELECT
ID AS CategoryID
, CAST(CONCAT(CAST(Category.ParentID AS varchar), '-', CAST(Id AS varchar)) AS varchar(50)) AS CatVar
, CategoryTree.LeafLevel + 1 AS LeafLevel
, Category.ParentID
FROM Category
JOIN CategoryTree ON Category.ParentId = CategoryTree.CategoryId
WHERE Category.ParentID IS NOT NULL
)
SELECT * FROM CategoryTree
输出:
CategoryID CatVar LeafLevel ParentID
1 1 0 NULL
2 1-2 1 1
3 1-3 1 1
4 2-4 2 2
5 2-5 2 2
6 2-6 2 2
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;
你能帮我得到所有类别和所有子类别吗?
数据库创建脚本
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
谢谢
如前所述,为此您需要一个递归 CTE。使这个有点棘手的一件事是您实际上是在将 ID (int) 转换为字符数据 (-)。
我相信下面的查询会让您开始获得所需的结果。不过,这并没有考虑到您实际上想要列出所有子项,而不管他们在层次结构中的位置。
WITH CategoryTree AS
(
SELECT
ID AS CategoryID
, CAST(ID AS varchar(50)) AS CatVar
, 0 AS LeafLevel
, ParentID
FROM Category WHERE ParentID IS NULL
UNION ALL
SELECT
ID AS CategoryID
, CAST(CONCAT(CAST(Category.ParentID AS varchar), '-', CAST(Id AS varchar)) AS varchar(50)) AS CatVar
, CategoryTree.LeafLevel + 1 AS LeafLevel
, Category.ParentID
FROM Category
JOIN CategoryTree ON Category.ParentId = CategoryTree.CategoryId
WHERE Category.ParentID IS NOT NULL
)
SELECT * FROM CategoryTree
输出:
CategoryID CatVar LeafLevel ParentID
1 1 0 NULL
2 1-2 1 1
3 1-3 1 1
4 2-4 2 2
5 2-5 2 2
6 2-6 2 2
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;