如何让一行始终显示(使用一个视图)

bmg*_*985 2 sql sql-server

我有以下(简化)视图:

SELECT        T1.item, T2.text
FROM            T1 LEFT OUTER JOIN
                         T2 ON T1.code = T2.code AND T1.item = T2.item
WHERE        (T1.item = '12345') AND (T1.code = '678') AND (T2.detailID = '99')
Run Code Online (Sandbox Code Playgroud)

T1

?????????????????????????????????
? code  ? item  ? other info... ?
?????????????????????????????????
? code1 ? item1 ? other info... ?
? code2 ? item2 ? other info... ?
?????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

T2

?????????????????????????????????????????????????????
? code  ? item  ? detailID  ? text  ?  other info   ?
?????????????????????????????????????????????????????
? code1 ? item1 ? detailID1 ? text1 ? other info... ?
? code1 ? item1 ? detailID2 ? text2 ? other info... ?
? code1 ? item1 ? detailID3 ? text3 ? other info... ?
? code2 ? item2 ? detailID1 ? text4 ? other info... ?
?????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

注意:detailID在多个代码/项目上重复使用

在大多数情况下,这很好.除了在某些情况下,detailID代码和项目不存在99.当发生这种情况时,它会返回0行(我认为LEFT OUTER JOIN会解决这个问题,但我的SQL非常业余).我怎么能得到它所以它确实返回一行,但只是

12345, ''
Run Code Online (Sandbox Code Playgroud)

那个例子的结果呢?

Gor*_*off 6

您需要将第二个表上的条件移动到on子句:

SELECT T1.item, T2.text
FROM T1 LEFT OUTER JOIN
     T2
     ON T1.code = T2.code AND T1.item = T2.item AND T2.detailID = '99'
WHERE (T1.item = '12345') AND (T1.code = '678') ;
Run Code Online (Sandbox Code Playgroud)

当没有匹配时,则值为,NULL并且您的原始where子句将其过滤掉.