如何使用SQL选择列对

时间:2011-02-23 04:17:41

标签: sql

我无法将这个问题写成一个句子,所以我举一个例子。假设您的数据库中包含以下表格:

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的朋友应该都在右侧。我想我必须做某种交叉产品,但我无法得到正确的输出。任何想法如何做到这一点?感谢。

2 个答案:

答案 0 :(得分:1)

union id1,id2id2,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方向上仅显示两次组合。