左一直与具有所有可能值的表联接吗?

时间:2018-07-12 21:55:23

标签: sql sql-server sql-server-2008 tsql

假设我有5个表:{!! $object->text !!} [AllStates][FerrariStates][ToyotaStates][FordStates]

每个表仅由一列组成:[TelsaStates]state拥有全部50种状态,其余的可能具有或没有全部状态。

我的结果将精确地有50行,每列将显示是否有Toyota,Ford,Ferrari和Telsa。因此结果将有5列。

因此,如果我想显示所有50个州,并在第二栏中显示包含法拉利的州,那么我的查询将如下所示:

[AllStates]

但是现在我想包括select [AllStates].state, [FerrariStates].state from [AllStates] left join [FerrariStates] on [AllStates].state = [FerrariStates].state 。我应该[TelsaStates]还是left join[AllStates]?还是应该是[FerrariStates]

同一问题将适用于inner join[ToyotaStates]。应该是[FordStates]还是left join?我应该用哪个表做inner join

1 个答案:

答案 0 :(得分:4)

假设每个状态最多有一行,您希望left join到第一个表:

select a.state,
       (case when f.state is not null then 1 else 0 end) as is_ferrari,
       (case when t.state is not null then 1 else 0 end) as is_tesla,
       . . .
from AllStates a left join
     FerrariStates f
     on f.state = a.state left join
     TeslaStates t
     on t.state = a.state left join
     . . .;

第一个表是AllStates。那就是人口。后续的联接应该全部从left join回到AllStates,以引入每个表中的值。

注意:

  • 使用表别名,以便查询更易于编写和阅读。
  • 消除不必要的方括号。
  • 使用case表达式获取0/1值。