我有一个包含2个表,团队和玩家的数据库:
Teams:
TeamID | TeamName
------------------
|1 | Team A |
|2 | Team B |
|3 | Team C |
------------------
Players:
PlayerID | Name | TeamID | Position
------------------------------------------
|1 | Anthony J | 1 | Guard |
|2 | Sam K | 2 | Guard |
|3 | Jack P | 2 | Forward |
|4 | Carlos B | 2 | Forward |
------------------------------------------
我希望为数据库中所有团队的名称选择一列,无论他们是否有玩家。如果位置为“前进”,则下一列应显示其名称,否则显示为空。团队中的每个“前锋”玩家应该有一排。
我用来获取此数据的查询是:
SELECT T.TeamName,
CASE WHEN P.Position = 'Forward'
THEN P.Name
END as ForwardPlayer
FROM Teams T
LEFT JOIN Players P on T.TeamID = P.TeamID
我需要的所有数据都驻留在这个数据集中,除了对于具有Forward的团队有一行为NULL,即:
TeamName | ForwardPlayer
-------------------------
|Team A | NULL |
|Team B | Jack B |
|Team B | Carlos B |
|Team B | NULL |
|Team C | NULL |
我意识到第4行存在是因为团队中有一个不符合案例条件的玩家,因此结果为NULL。
在外部查询上设置where子句以将数据集限制为“前进”玩家将省略所有没有任何前方玩家的团队。我需要所有团队名称都出现在数据集中。
使用嵌套选择获取此选项仅在每个团队有1个Foward时才有效。
对于那些拥有满足此条件的播放器的团队,有没有办法省略这些NULL行?
答案 0 :(得分:3)
不要做CASE
。你只是想直接将玩家限制为只转发,然后进行JOIN
:
SELECT T.TeamName, P.Name
FROM Teams T
LEFT JOIN Players P ON T.TeamID = P.TeamID
AND P.Position = 'Forward'