使用Distinct或Case减少查询结果

时间:2019-04-17 13:26:02

标签: sql case distinct

该场景是有关网球的简单数据库,它是:

  • 选择名字中至少有两个“ e”的男性选手。 (这个 很好)

  • 显示当前具有functie(角色)的人员列表 桌板成员(称为bestuursleden)。我已经推论了 是当逻辑上eind_datum列(结束日期)为NULL时 原因是我的查询一样。

  • 当前没有 functie(功能)的男选手也应该 被显示。这是问题所在。

预期结果:

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

如果我省略在哪里检查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

使用pgadmin作为工具的Postgres。

我的表格定义:

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

据我所知,您想展示玩家及其当前角色(如果有)。最好在join语句中包含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

这将仅加入结束日期为bestuursleden(表示最新日期)的NULL行。如果设置了结束日期,则不会加入该结束日期,因此您将从NULLs的字段中获得bestuursleden

注意:在引用具有联接的查询中的列名称时,总是使用表别名。否则,不熟悉您的数据库的人将不知道给定列的来源。