繁体   English   中英

SQL Server 递归自联接

[英]SQL Server recursive self join

我有一个简单的类别表,如以下列:

  • ID
  • 姓名
  • 父 ID

因此,无限数量的类别可以是类别的子项。 以以下层次结构为例:

在此处输入图片说明

我希望,在返回类别“商务笔记本电脑”的简单查询中,还返回包含所有父项、逗号分隔符或其他内容的列:

在此处输入图片说明

或者以下面的例子为例:

在此处输入图片说明

递归 cte 来拯救......

创建并填充示例表(在您以后的问题中保存我们这一步):

DECLARE @T as table
(
    id int,
    name varchar(100),
    parent_id int
)

INSERT INTO @T VALUES
(1, 'A', NULL),
(2, 'A.1', 1),
(3, 'A.2', 1),
(4, 'A.1.1', 2),
(5, 'B', NULL),
(6, 'B.1', 5),
(7, 'B.1.1', 6),
(8, 'B.2', 5),
(9, 'A.1.1.1', 4),
(10, 'A.1.1.2', 4)

CTE:

;WITH CTE AS
(
    SELECT id, name, name as path, parent_id
    FROM @T 
    WHERE parent_id IS NULL
    UNION ALL
    SELECT t.id, t.name, cast(cte.path +','+ t.name as varchar(100)), t.parent_id
    FROM @T t
    INNER JOIN CTE ON t.parent_id = CTE.id
)

查询:

SELECT id, name, path
FROM CTE

结果:

id      name        path
1       A           A
5       B           B
6       B.1         B,B.1
8       B.2         B,B.2
7       B.1.1       B,B.1,B.1.1
2       A.1         A,A.1
3       A.2         A,A.2
4       A.1.1       A,A.1,A.1.1
9       A.1.1.1     A,A.1,A.1.1,A.1.1.1
10      A.1.1.2     A,A.1,A.1.1,A.1.1.2

在 rextester 上查看在线演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM