CTE 显示所有传递相关的元素(兄弟姐妹)
CTE to show all transitively related elements (siblings)
我有一个 table 兄弟姐妹,其 ID 列为 Child1 和 Child2:
Child1
Child2
1
2
2
3
4
6
5
1
create table Siblings (Child1 int, Child2 int)
insert into Siblings values (1,2)
insert into Siblings values (2,3)
insert into Siblings values (4,6)
insert into Siblings values (5,1)
对于每一行,Child1 是 Child2 的兄弟(反之亦然,因为兄弟关系是对称的)例如1 是上面 table 第一行中 2 的兄弟姐妹。又因为1是2的兄弟,2是3的兄弟,那么1也是3的兄弟(兄弟关系是传递的)。使用 TSQL 如何显示上面 table 中明显的所有兄弟关系?我假设这里需要使用递归通用 table 表达式 (CTE)。我今天才开始深入研究 CTE,所以我对如何解决这个问题感到有些困惑。我希望看到这样的输出:
Child
Sibling
1
2
1
3
1
5
2
1
2
3
2
5
3
1
3
2
3
5
4
6
5
1
5
2
5
3
6
1
或一个 select 语句,它将简单地显示所有 Child ID 是给定 Child ID 的兄弟姐妹。非常感谢任何帮助,谢谢!
不知道是否有使用 CTE 执行此操作的好方法。这里有一些有用的东西,如果没有别的,你可以用它来测试其他解决方案...
Drop Table If Exists #Siblings
Create Table #Siblings(Child1 Int, Child2 Int)
Insert Into #Siblings values (1,2),(2,3),(4,6),(5,1)
Drop Table If Exists #Res
Create Table #Res(C1 Int, C2 Int)
Insert Into #Res(C1, C2)
Select Child1, Child2 From #Siblings
Union
Select Child2, Child1 From #Siblings
Declare @RC Int = 1
While @RC > 0
Begin
Insert Into #Res(C1, C2)
Select R1.C1, R2.C2
From
#Res As R1
Inner Join #Res As R2
On R1.C2 = R2.C1
Where Not Exists(Select *
From #Res As NoDupes
Where NoDupes.C1 = R1.C1 And NoDupes.C2 = R2.C2)
Set @RC = @@ROWCOUNT
End
Select Distinct * From #Res Where C1 != C2 Order By 1, 2
我有一个 table 兄弟姐妹,其 ID 列为 Child1 和 Child2:
Child1 | Child2 |
---|---|
1 | 2 |
2 | 3 |
4 | 6 |
5 | 1 |
create table Siblings (Child1 int, Child2 int)
insert into Siblings values (1,2)
insert into Siblings values (2,3)
insert into Siblings values (4,6)
insert into Siblings values (5,1)
对于每一行,Child1 是 Child2 的兄弟(反之亦然,因为兄弟关系是对称的)例如1 是上面 table 第一行中 2 的兄弟姐妹。又因为1是2的兄弟,2是3的兄弟,那么1也是3的兄弟(兄弟关系是传递的)。使用 TSQL 如何显示上面 table 中明显的所有兄弟关系?我假设这里需要使用递归通用 table 表达式 (CTE)。我今天才开始深入研究 CTE,所以我对如何解决这个问题感到有些困惑。我希望看到这样的输出:
Child | Sibling |
---|---|
1 | 2 |
1 | 3 |
1 | 5 |
2 | 1 |
2 | 3 |
2 | 5 |
3 | 1 |
3 | 2 |
3 | 5 |
4 | 6 |
5 | 1 |
5 | 2 |
5 | 3 |
6 | 1 |
或一个 select 语句,它将简单地显示所有 Child ID 是给定 Child ID 的兄弟姐妹。非常感谢任何帮助,谢谢!
不知道是否有使用 CTE 执行此操作的好方法。这里有一些有用的东西,如果没有别的,你可以用它来测试其他解决方案...
Drop Table If Exists #Siblings
Create Table #Siblings(Child1 Int, Child2 Int)
Insert Into #Siblings values (1,2),(2,3),(4,6),(5,1)
Drop Table If Exists #Res
Create Table #Res(C1 Int, C2 Int)
Insert Into #Res(C1, C2)
Select Child1, Child2 From #Siblings
Union
Select Child2, Child1 From #Siblings
Declare @RC Int = 1
While @RC > 0
Begin
Insert Into #Res(C1, C2)
Select R1.C1, R2.C2
From
#Res As R1
Inner Join #Res As R2
On R1.C2 = R2.C1
Where Not Exists(Select *
From #Res As NoDupes
Where NoDupes.C1 = R1.C1 And NoDupes.C2 = R2.C2)
Set @RC = @@ROWCOUNT
End
Select Distinct * From #Res Where C1 != C2 Order By 1, 2