-1

我有 2 张桌子 A 和 B

A 有 cols(AKey, val1, val2) B 有 Cols(BKey,Akey, ValX, valY)

我有以下查询

    select a.Val1,a.Val2,b.ValX
    from A
    Left Join B on a.AKey = b.Akey
    where a.Akey ={someValue}
    and ((b.valY ={aDifferentVal}) or (b.valY is NULL))

情况是我总是想从表 A 中返回值。当连接中存在 {aDifferentVal} 时,它也有效,当表 B 中没有用于连接的值时,它也有效,但是当表中有值时用于联接,但这些都不是 {aDifferentVal} 然后查询不返回任何内容,我仍然想要表 A 中的值。

我怎样才能做到这一点?

4

2 回答 2

0

只需将left joined 表上的条件从where子句移动到连接on子句 - 否则它们将成为强制性的,并且未填充的行将被归档(此处删除匹配但valy不匹配的行{adifferentval}):

select a.val1,a.val2,b.valx
from a
left join b 
    on  b.akey = a.akey
    and b.valy = {adifferentval}
where a.akey = {somevalue}
于 2020-09-03T01:23:45.230 回答
0

第二个表的条件移至on子句:

select a.Val1,a.Val2,b.ValX
from A Left Join
     B
     on a.AKey = b.Akey and (b.valY ={aDifferentVal})
where a.Akey = {someValue}

子句中的过滤where(有点)将外连接变成内连接。您的版本稍好一些,因为它正在检查NULL. 但是,匹配的行是:

  • B 中根本不匹配的 A 值。
  • 与您指定的条件匹配的 A 值。

过滤掉的是与 B 中的一行匹配的 A 值,但没有一个匹配项具有您指定的条件。

于 2020-09-03T01:24:09.517 回答