该场景是有关网球的简单数据库,它是:
选择名字中至少有两个“ 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。
我的表格定义:
答案 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
。
注意:在引用具有联接的查询中的列名称时,总是使用表别名。否则,不熟悉您的数据库的人将不知道给定列的来源。