【问题标题】:Avoid duplicated records in nullable relationship避免可空关系中的重复记录
【发布时间】:2019-03-11 15:19:42
【问题描述】:

给定一张玩家桌:

-------------------------
| id    | name  | email |
-------------------------

还有一张友谊表:

------------------------------------
| status    | playerId  | friendId |
------------------------------------

我正在使用以下查询来检索玩家信息和玩家之间的关系状态:

declare @id int = 1

select * from 
(SELECT
    p.id,
    p.name,
    p.email,
    p.email_verified,
    p.gender,
    p.picture,
    f1.playerId,
    f1.friendId,
    f1.status

  FROM players p
    LEFT OUTER JOIN friendships f1
    ON
  f1.playerId = p.id or f1.friendId = p.id) as pl
WHERE
pl.id <> @id

结果如下:

id  name        email                       playerId    friendId    status
2   Nina        el@gmail.com                2           1           1
2   Nina        el@gmail.com                2           49          1
49  Ciccio      testpast@gmail.com          2           49          1

在这种情况下,用户 2 与用户 1 和另一个用户处于好友关系,我需要显示第一条记录,因为它与用户 id 参数有关系,但我还需要检索所有用户,好友关系和不是。 我该怎么办?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    使用row_number()窗口函数

    select * from (SELECT
        p.id,
        p.name,
        p.email,
        p.email_verified,
        p.gender,
        p.picture,
        f1.playerId,
        f1.friendId,
        f1.status,
        row_number() over(partition by p.id,
        p.name,
        p.email,f1.friendId order by id) rn
    
      FROM players p
        LEFT OUTER JOIN friendships f1
        ON
      f1.playerId = p.id or f1.friendId = p.id
    ) t where t.rn=1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      相关资源
      最近更新 更多