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)