📅  最后修改于: 2023-12-03 15:41:58.015000             🧑  作者: Mango
在SQL Server中,递归查询是指使用相同的查询来多次访问数据库中的同一表。这对于分层数据结构非常有用,例如组织结构、树状结构等。
WITH RecursiveCTE AS (
-- Anchor member definition
SELECT <columns>
FROM <table>
WHERE <condition>
UNION ALL
-- Recursive member definition
SELECT <columns>
FROM <table>
JOIN RecursiveCTE
ON <join condition>
)
SELECT <columns> FROM RecursiveCTE
其中,WITH RecursiveCTE
语句定义递归公共表达式(CTE)。RecursiveCTE
是递归查询的名称,你可以自定义。递归CTE包括以下两个部分:
最后,递归查询是通过在递归CTE上的SELECT查询中调用自身来完成的。
例如,下面是一个示例表,它表示基于ID和ParentID的树结构:
CREATE TABLE TestTreeStructure (
ID int NOT NULL,
ParentID int NULL,
Name varchar(50) NOT NULL,
PRIMARY KEY (ID)
);
INSERT INTO TestTreeStructure
VALUES (1, NULL, 'Root'),
(2, 1, 'Level 1-1'),
(3, 1, 'Level 1-2'),
(4, 2, 'Level 2-1'),
(5, 3, 'Level 2-2'),
(6, 4, 'Level 3-1');
在此示例中,每行都表示一条记录,它包含唯一的ID值和ParentID值。ID表示每个记录的唯一标识符,而ParentID表示每个记录所属的上一级ID值。
对于此结构,以下是使用递归CTE查询其层次结构的示例:
WITH RecursiveCTE AS (
SELECT ID, ParentID, Name, 1 AS Level
FROM TestTreeStructure
WHERE ParentID IS NULL
UNION ALL
SELECT t.ID, t.ParentID, t.Name, Level + 1
FROM TestTreeStructure t
JOIN RecursiveCTE r ON t.ParentID = r.ID
)
SELECT ID, Name, Level
FROM RecursiveCTE
ORDER BY Level, ID;
此查询返回以下结果:
ID Name Level
----------- -------------------------------------------------- -----------
1 Root 1
2 Level 1-1 2
3 Level 1-2 2
4 Level 2-1 3
5 Level 2-2 3
6 Level 3-1 4
通过递归CTE查询,我们可以轻松地获取任何分层数据结构的层级结构。