gpt4 book ai didi

sql - 棘手的选择语句

转载 作者:行者123 更新时间:2023-12-04 18:25:42 25 4
gpt4 key购买 nike

我有一个包含类别的表,每个类别都有一个 ID、一个名称和一个 ParentID。问题是有3个级别,父类、子类和子类。

我可以使用简单的 SELECTWHERE ParentID IS NULL 子句来提取父类别:

SELECT *
FROM Category
WHERE ParentID IS NULL

但是,WHERE ParentID IS NOT NULL 子句将返回子类别和子类别。

我正在寻找一种仅提取子类别和子类别的方法。

最佳答案

通常,对于这类问题,最好使用 Recursive Queries Using Common Table Expressions .像这样:

;WITH CategoriesTree(CategoryID, CategoryName, ParentName, CategoryLevel)
AS
(
SELECT
c.ID,
c.Name,
CAST('No Parent' AS VARCHAR(50)) AS ParentName,
0 AS CategoryLevel
FROM @Categories c
WHERE c.ParentID IS NULL
UNION ALL
SELECT c.ID, c.Name, p.CategoryName, p.CategoryLevel + 1
FROM CategoriesTree p
INNER JOIN @Categories c ON c.ParentID = p.CategoryID
)
SELECT *
FROM CategoriesTree
Where CategoryLevel = some id;

SQL Fiddle Demo

这会给你:

CATEGORYID       CATEGORYNAME         PARENTNAME      CATEGORYLEVEL
1 Root Cateogry No Parent 0
2 Sub Cateogry 1 Root Cateogry 1
3 Sub Cateogry 2 Root Cateogry 1
4 Sub Cateogry 3 Root Cateogry 1
8 sub Cateogry 1 of 3 Sub Cateogry 3 2
7 Sub Cateogry 1 of 2 Sub Cateogry 2 2
5 Sub Cateogry 1 of 1 Sub Cateogry 1 2
6 sub Cateogry 2 of 1 Sub Cateogry 1 2

这是如何工作的?

使用此查询,您可以控制要选择的类别级别。例如,对于我在上一个演示中使用的示例数据,这里是类别树:

                        1: RootCategory                Category Level:  0
|
|
----------------------------
| | |
| | |
2: Sub1 3: Sub2 4: sub3 Category Level: 1
| | |
------------ | |
| | | |
| | | |
5: Sub1of1 6: Sub2of1 7: sub1of2 8: sub1of3 Category Level: 2

此查询将为您提供带有新生成的 CategoryLevel 列的类别树。

注意:在我在演示中使用的示例数据中,只有一个父类别(parentid为NULL的类别)。但是,如果有很多父类别,查询将可以正常工作。而这是因为CTE的anchor query,即:

SELECT 
c.ID,
c.Name,
CAST('No Parent' AS VARCHAR(50)) AS ParentName,
0 AS CategoryLevel
FROM @Categories c
WHERE c.ParentID IS NULL;

然后,您可以使用生成的列CategoryLevel仅选择您感兴趣的级别的子类别。

例如,如果只需要选择根类别的第一个子类别的子类别,则可以使用谓词CategoryLevel = 2:

;WITH CategoriesTree(CategoryID, CategoryName, ParentName, CategoryLevel)
AS
(
...
)
SELECT *
FROM CategoriesTree
WHERE CategoryLevel = 2;

这会给你:

CATEGORYID       CATEGORYNAME         PARENTNAME      CATEGORYLEVEL
8 sub Cateogry 1 of 3 Sub Cateogry 3 2
7 Sub Cateogry 1 of 2 Sub Cateogry 2 2
5 Sub Cateogry 1 of 1 Sub Cateogry 1 2
6 sub Cateogry 2 of 1 Sub Cateogry 1 2

SQL Fiddle Demo

关于sql - 棘手的选择语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13738865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com