📜  递归查询分层数据sql server - SQL (1)

📅  最后修改于: 2023-12-03 15:41:58.015000             🧑  作者: Mango

递归查询分层数据SQL Server

在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包括以下两个部分:

  • Anchor Member:起始查询,定义递归的基本记录(也称为递归基础)。
  • Recursive Member:迭代查询,定义递归查询的条件、联接和返回结果。

最后,递归查询是通过在递归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查询,我们可以轻松地获取任何分层数据结构的层级结构。