我无法将这个问题写成一个句子,所以我举一个例子。假设您的数据库中包含以下表格:
Users(id, name)
Friends(id1, id2)
Friends(id1)
和Friends(id2)
都是引用Users(id)
的外键。查询在一侧获取用户ID以及在另一侧获取所有朋友的内容是什么样的。 friends表中的数据如下所示:
id1 id2
-------
1 2
1 3
1 4
2 3
2 4
2 5
5 1
我想要一个像这样的输出:
id1 id2
-------
1 2
1 3
1 4
1 5
2 1
2 3
2 4
2 5
3 1
3 2
4 1
4 2
5 1
5 2
所有用户ID都应位于左侧,该用户ID的朋友应该都在右侧。我想我必须做某种交叉产品,但我无法得到正确的输出。任何想法如何做到这一点?感谢。
答案 0 :(得分:1)
union
id1,id2
与id2,id1
的组合:
;with FriendShips as (
select
id1, id2
from
Friends F1
union
select
id2, id1
from
Friends F2
)
select
u1.name, u2.name
from
FriendShips F
inner join
Users u1 on F.id1 = u1.id
inner join
Users u2 on F.id2 = u2.id
答案 1 :(得分:1)
这应该这样做
select id1, id2
from friends
union
select id2, id1
from friends
击败38秒...然后我会抛出一个解释。如果a是b的朋友,并且它存储为(a,b),则以相反的顺序(b,a)选择列,以便最终得到联合结果中的两个变体。
Union =执行明显的
Union All =保持重复结果
使用Union
可以让您有时存储(a,b)as well as
(b,a),此查询仍会在ab和ba方向上仅显示两次组合。