我有两个简单的SQL表定义如下:
朋友表就像:
Id1 Id2
1 2
1 3
2 3
3 4
如何查询数据库中的朋友名称,省略重复? (这意味着如果这对“约翰”和“大卫”在回答中,我就不需要大卫'以及'约翰'对)
答案 0 :(得分:1)
SELECT p1.name,
p2.name
FROM Friend AS f1
JOIN Person AS p1 ON p1.id = f1.id1
JOIN Person AS p2 ON f1.id2 = p2.id
WHERE f1.id1 < f1.id2
可能是这个。
答案 1 :(得分:0)
你总是可以建立一个联合,然后从中查询不同的对......就像这样:
select distinct p1, p2 from
(
select id1 p1, id2 p2 from friend
union
select id2, id1 from friend
)
答案 2 :(得分:0)
使用投影确保朋友对首先排在最低位置,这样可以使用DISTINCT
使重复删除变得微不足道:
WITH OrderedFriends AS
(
SELECT
CASE WHEN ID1 < ID2 THEN ID1 ELSE ID2 END AS ID1,
CASE WHEN ID1 < ID2 THEN ID2 ELSE ID1 END AS ID2
FROM Friends
)
SELECT DISTINCT
ID1, ID2
FROM OrderedFriends ;
请注意,如果重要的话,朋友对的原始排序会丢失吗?
答案 3 :(得分:0)
在这个未经测试的代码中,我生成一个关系,其中我拥有所有友谊的所有id
- 对,第一个id
是较小的,而第二个是较大的。使用临时关系我将其加入Person
表以获取name
。
select person1.name, person2.name
from
(select distinct leftid, rightid
from
(select id1 as leftid, id2 as rightid
from friend
where leftid <= rightid)
union
(select id2 as leftid, id1 as rightid
from friend
where leftid > rightid)) temptable
join Person person1
on temptable.leftid = person1.id
join Person person2
on temptable.rightid = person2.id