请考虑以下表格#Facebook的数据如下:
Id Username Friend_Username 1 U1 U2 2 U3 U4 3 U1 U5 4 U2 U1 5 U3 U4 6 B S 7 S B 8 S B 9 B S
使用单个查询时所需的输出:
Id Username Friend_Username 1 U1 U2 2 U3 U4 3 U1 U5 6 B S
或
Id Username Friend_Username 2 U3 U4 3 U1 U5 4 U2 U1 7 S B
输出背后的概念是当一个id的Username与其他id的Friend_Username匹配,以及该id的Friend_Username与同一id的Username匹配时,我们需要考虑一个记录,并且可以使用其中一个: EXMP:
6 B S 7 S B
在此记录中,我们应考虑6 B S
或7 S B
答案 0 :(得分:5)
试试这个:
select distinct
case when username < friend_username then username else friend_username end username,
case when username < friend_username then friend_username else username end friend_username
from TABLE_NAME
背后的逻辑很简单:对每一行进行排序,因此在第一列中存在“较小”值,在第二列中存在“较大”值。然后,它足以选择不同的值,因为这将独立于行内的初始顺序删除任何重复的行。
答案 1 :(得分:2)
您可以使用以下查询:
SELECT Id, Username, Friend_Username
FROM (
SELECT Id, Username, Friend_Username,
ROW_NUMBER() OVER (PARTITION BY CASE
WHEN Username < Friend_Username THEN Username
ELSE Friend_Username
END,
CASE
WHEN Friend_Username < Username THEN Username
ELSE Friend_Username
END
ORDER BY Id) AS rn
FROM Facebook) AS t
WHERE t.rn = 1
<强>输出:强>
Id Username Friend_Username
----------------------------
6 B S
1 U1 U2
3 U1 U5
2 U3 U4
注意:只有在您有兴趣返回Username
或Friend_Username
以外的任何字段时,才需要使用此技术。否则@ Michal的答案更可取。
答案 2 :(得分:0)
您可以通过以下查询
来实现SELECT DISTINCT Username,Friend_Username
FROM tblUsers t1
WHERE t1.Username > t1.Friend_Username
OR NOT EXISTS (
SELECT * FROM tblUsers t2
WHERE t2.Username = t1.Friend_Username AND t2.Friend_Username = t1.Username
)