Sql 选择特定层次结构中的项目
我有一个文章类别表,如下所示:Sql 选择特定层次结构中的项目,sql,sql-server,Sql,Sql Server,我有一个文章类别表,如下所示: 作为第二个条款表: | Id | CategoryId | Name | 1 | 4 | Simple keyboard | 2 | 5 | Simple mouse | 3 | 6 | Simple nothing Article.CategoryId->Category.Id Category.ParentId->Category.Id 现在我需要选择所有属于计算机附件的文章。如何做到这一点?我尝
作为第二个条款表:
| Id | CategoryId | Name
| 1 | 4 | Simple keyboard
| 2 | 5 | Simple mouse
| 3 | 6 | Simple nothing
Article.CategoryId->Category.Id
Category.ParentId->Category.Id
现在我需要选择所有属于计算机附件的文章。如何做到这一点?我尝试过做一些递归查询,但没有成功
预期结果是:
| 1 | Simple keyboard
| 2 | Simple mouse
由于他们的类别指向一个类别,该类别的父类别ID为2,我正在搜索该类别,因此我认为您正在查找以下内容:
SELECT * FROM
Categories C
LEFT JOIN
Articles A
ON C.Id = A.CategoryId
WHERE C.Name = "Computer Accessories"
这将选择“计算机附件”作为名称-它有一个分配给它的ID,即2。通过加入,它将向您显示类别ID为2的所有文章。尝试以下操作:
MS SQL Server 2012架构设置:
CREATE TABLE Category
(
ID INT,
ParentId INT,
Name VARCHAR(255)
)
CREATE TABLE Article
(
ID INT,
CategoryId INT,
Name VARCHAR(255)
)
INSERT INTO Category
VALUES
(6,1, 'Something Else'),
(5,2, 'Mice'),
(4,2, 'Keyboards'),
(2,1,'Computer Accessories'),
(1, 0, 'All')
INSERT INTO Article
VALUES
(1,4,'Simple keyboard'),
(2,5,'Simple mouse'),
(3,6,'Simple nothing')
;WITH CTE
AS
(
SELECT ID, ParentId, Name
FROM Category
WHERE Name = 'Computer Accessories'
UNION ALL
SELECT c1.ID, c1.ParentId, c1.Name
FROM Category c1
INNER JOIN CTE c2
ON c1.ParentId = c2.Id
)
SELECT Article.Id, Article.Name
FROM CTE
INNER JOIN Article
ON Article.CategoryId = CTE.Id
| ID | NAME |
|----|-----------------|
| 1 | Simple keyboard |
| 2 | Simple mouse |
查询1:
CREATE TABLE Category
(
ID INT,
ParentId INT,
Name VARCHAR(255)
)
CREATE TABLE Article
(
ID INT,
CategoryId INT,
Name VARCHAR(255)
)
INSERT INTO Category
VALUES
(6,1, 'Something Else'),
(5,2, 'Mice'),
(4,2, 'Keyboards'),
(2,1,'Computer Accessories'),
(1, 0, 'All')
INSERT INTO Article
VALUES
(1,4,'Simple keyboard'),
(2,5,'Simple mouse'),
(3,6,'Simple nothing')
;WITH CTE
AS
(
SELECT ID, ParentId, Name
FROM Category
WHERE Name = 'Computer Accessories'
UNION ALL
SELECT c1.ID, c1.ParentId, c1.Name
FROM Category c1
INNER JOIN CTE c2
ON c1.ParentId = c2.Id
)
SELECT Article.Id, Article.Name
FROM CTE
INNER JOIN Article
ON Article.CategoryId = CTE.Id
| ID | NAME |
|----|-----------------|
| 1 | Simple keyboard |
| 2 | Simple mouse |
:
CREATE TABLE Category
(
ID INT,
ParentId INT,
Name VARCHAR(255)
)
CREATE TABLE Article
(
ID INT,
CategoryId INT,
Name VARCHAR(255)
)
INSERT INTO Category
VALUES
(6,1, 'Something Else'),
(5,2, 'Mice'),
(4,2, 'Keyboards'),
(2,1,'Computer Accessories'),
(1, 0, 'All')
INSERT INTO Article
VALUES
(1,4,'Simple keyboard'),
(2,5,'Simple mouse'),
(3,6,'Simple nothing')
;WITH CTE
AS
(
SELECT ID, ParentId, Name
FROM Category
WHERE Name = 'Computer Accessories'
UNION ALL
SELECT c1.ID, c1.ParentId, c1.Name
FROM Category c1
INNER JOIN CTE c2
ON c1.ParentId = c2.Id
)
SELECT Article.Id, Article.Name
FROM CTE
INNER JOIN Article
ON Article.CategoryId = CTE.Id
| ID | NAME |
|----|-----------------|
| 1 | Simple keyboard |
| 2 | Simple mouse |
“我尝试过做一些递归查询”。。。你能把它寄出去吗?这两个表是如何链接的?你的层次结构有多深,预期的结果是什么?查询固定级别相对简单(最多5个级别-可以使用联接完成);查询未知级别需要更多的努力(需要递归CTE或类似),谢谢,但这不是我需要的。我需要的文章有一个类别,这是另一个类别的孩子(ID 2)