从友谊表查询中删除重复的结果

时间:2014-05-02 19:19:10

标签: sql

我有两个简单的SQL表定义如下:

  • 朋友(id1,id2)
  • 人(身份证,姓名)

朋友表就像:

     Id1        Id2  
      1          2  
      1          3  
      2          3  
      3          4  

如何查询数据库中的朋友名称,省略重复? (这意味着如果这对“约翰”和“大卫”在回答中,我就不需要大卫'以及'约翰'对)

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 ;

SqlFiddle Here

请注意,如果重要的话,朋友对的原始排序会丢失吗?

答案 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