如何从一个表中选择所有行,如果存在,则从另一个表中选择任何匹配?

时间:2015-07-14 01:21:49

标签: tsql select case

我有一个包含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行?

1 个答案:

答案 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'