当相对行可能不存在时从联接表中选择

时间:2018-07-07 13:33:49

标签: sql sql-server tsql sql-server-2016

TSQL专家,我面对着两个看起来像这样的表:

表格-名称

ID(pk)  Name
1       Peter
2       Paul
3       Mary
4       John
5       Fred

桌子-汽车

NameID(pk)  FieldNum    CarText
1           1           Ford
1           2           abcd123
1           3           Mustang
1           4           1967
1           6           Yellow
2           2           qwer456
2           4           1980
3           1           Chevrolet
3           3           Camaro
4           1           Chrysler
4           2           zxcv789
5           4           1970

由于第一个(名称)表中的所有名称都是必需的,但是第二个表中只涉及FieldNum = 2(如果存在),因此所需的输出将类似于以下内容:

Name        CarText
---------------------
Peter       abcd123
Paul        qwer456
Mary        
John        zxcv789
Fred

或者为此,在这些行上使用某种形式的空占位符的输出也将可用:

Name        CarText
---------------------
Peter       abcd123
Paul        qwer456
Mary        foo
John        zxcv789
Fred        foo

各种文档建议将表联接更改为LEFT(或LEFT OUTER)联接是解决方案。没问题。

SELECT Name, CarText
 FROM Names
 LEFT JOIN Cars on Names.ID = Cars.NameID
WHERE Cars.FieldNum = 2

但是这种方法可以实现:

Name        CarText
---------------------
Peter       abcd123
Paul        qwer456
John        zxcv789

因此,在对RANK(),ROWNUM,CASE和WHERE EXISTS / NOT EXISTS语句进行了业余试验之后,感觉答案很尴尬,但是几天后我就无法确定。

如何实现所需的输出,其中一个表是强制性的,而联接表仅在存在/存在时(或在必要时代替某种相关字段,而是某种无效值)才提供相关字段? / p>

1 个答案:

答案 0 :(得分:3)

Completable.empty()子句将WHERE变成了LEFT JOIN。要保留不匹配的行,请将条件移至INNER JOIN子句:

ON