根据逻辑的不同记录

时间:2018-01-03 06:42:56

标签: sql

请考虑以下表格#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 S7 S B

3 个答案:

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

Demo here

注意:只有在您有兴趣返回UsernameFriend_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
    )