递归自联接以解压缩通讯组列表



我有一个"列表"表,该表包含 2 列 [ListName] 和 [MemberName],但是成员名称可以是一个人的名字,也可以是另一个列表的名称(嵌套列表( - 数据来自外部来源。

CREATE TABLE Lists
(
ListName varchar(255) NOT NULL,
MemberName varchar(255) NOT NULL
)

没有什么能阻止对列表名称的最终"自我引用">

例如

List01 - Contains List02
List02 - Contains List03 and List04 
List03 - Contains List01

我正在寻找的是

1(确定是否存在任何嵌套自引用的方法

2( 如果没有,则返回包含所有嵌套列表的单个合并列表

例如

List01 - List02Member01
List01 - List01Member02
List01 - List01Member03
List01 - List02Member01
List01 - List02Member02
List01 - List03Member01
List01 - List04Member01
List02 - List02Member01
List02 - List02Member02
List02 - List03Member01
List02 - List04Member01

等。。

即,每个列表的完全展开列表已展开

嵌套我怀疑 CTE 会在某个地方参与答案,但目前我什至很难看到如何开始这个答案。

示例源数据 - 在"列表"表中(经过模糊处理(

ListName        MemberName
========        ==========
DomainList01   DomainMember01
DomainList01   DomainMember02
DomainList01   DomanMember03
DomainList02   DomainMember04
DomainList02   DomainMember02
DomainList02   DomainList03
DomainList02   DomainList04
DomainList03   DomainMember05
DomainList03   DomainMember06
DomainList03   DomainList05
DomainList04   DomainMember07
DomainList04   DomainMember08
DomainList05   DomainMember09
DomainList05   DomainList01
DomainList01   DomainList02

我认为您正在寻找这样的东西。

;WITH list_structure AS
(
SELECT CAST(l1.listname AS NVARCHAR(255)) AS list_path,
l1.listname,
CAST(l1.membername AS NVARCHAR(255)) AS membername
FROM lists l1
WHERE l1.listname NOT IN (SELECT membername FROM lists)
UNION ALL
SELECT CAST(list_structure.list_path + '/' + l.listname AS NVARCHAR(255)), 
l.listname,
l.membername
FROM lists l
INNER JOIN list_structure
ON l.listname = list_structure.membername
)
SELECT list_path + '/' + list_structure.membername FROM list_structure
WHERE list_structure.membername NOT IN (SELECT listname FROM lists)

在我的头顶上:

要检测直接自引用,请执行以下操作:

select l1.listname, l1.membername from lists l1
where exists (select * from lists l2 where l1.membername = l2.listname)

如果这有效,则该查询未返回的任何内容都可用于生成第二个结果。

最新更新