代码之家  ›  专栏  ›  技术社区  ›  invernomuto

避免在可空关系中重复记录

  •  1
  • invernomuto  · 技术社区  · 5 年前

    给定一个玩家表:

    -------------------------
    | 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参数有关,但我还需要检索所有用户,友好的和非友好的。 我该怎么办?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Zaynul Abadin Tuhin    5 年前

    使用 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