使用 Distinct 或 Case 减少查询结果

Using Distinct or Case to reduce results in query

场景是关于网球的简单数据库,是:

预期 结果:

naam (name)  | geslacht (gender)|   functie (role)
_____________|__________________|_______________
Permentier   | M                | Voorzitter
Bakker, de   | M                | NULL
Bohemen, van | M                | NULL
Meuleman     | M                | Penningmeester
Permentier   | M                | NULL

我的 结果(我遗漏了名字 Bohemen,van):

naam (name)  | geslacht (gender)|   functie (role)
_____________|__________________|_______________
Permentier   | M                | Voorzitter
Bakker, de   | M                | NULL
Meuleman     | M                | Penningmeester
Permentier   | M                | NULL

我的查询:

SELECT naam AS role, geslacht AS gender, functie AS role
FROM spelers s LEFT JOIN bestuursleden b ON s.spelersnr = b.spelersnr
WHERE geslacht LIKE 'M' AND LOWER(naam) LIKE '%e%e%' AND eind_datum IS NULL
ORDER BY s.spelersnr

如果我省略 WHERE 检查 AND eind_datum IS NULL 我得到以下结果,注意我添加了两列额外信息(开始日期和结束日期)以帮助确定我是否可以使用 CASE 或特定的 DISTINCT 函数来帮助我保持 Bohemen, van 我当前查询结果中缺少的记录:

naam (name)  | geslacht (gender)|   functie (role)| begin_date | end_date
_____________|__________________|_________________|____________|___________
Permentier   | M                | Secretaris      |  NOT NULL  | NOT NULL
Permentier   | M                | Lid             |  NOT NULL  | NOT NULL
Permentier   | M                | Penningmeester  |  NOT NULL  | NOT NULL
Permentier   | M                | Voorzitter      |  NOT NULL  | NULL
Bakker, de   | M                | NULL            |  NULL      | NULL
Bohemen, van | M                | Secretaris      |  NOT NULL  | NOT NULL    
Meuleman     | M                | Penningmeester  |  NOT NULL  | NULL
Permentier   | M                | NULL            |  NULL      | NULL

它的 Postgres,使用 pgadmin 作为工具。

我的 Table 定义:

据我了解,您想要显示玩家及其当前角色(如果他们拥有一个角色)。最好在连接语句中包含您的 end_date 条件,如下所示:

SELECT s.naam AS role
     , s.geslacht AS gender
     , b.functie AS role
  FROM spelers s 
  LEFT 
  JOIN bestuursleden b 
    ON s.spelersnr = b.spelersnr
   AND b.eind_datum IS NULL
 WHERE s.geslacht = 'M' 
   AND LOWER(s.naam) LIKE '%e%e%'
 ORDER BY s.spelersnr

这只会加入结束日期为 NULLbestuursleden 行,即最新的行。如果玩家设置了结束日期,则不会加入,因此您将在 bestuursleden.

的字段中获得 NULLs

注意:始终 在引用具有连接的查询中的列名时使用 table 别名。否则不熟悉您的数据库的人将不知道给定列的来源。