SQL 左联接 - 来自右的固定值 table

SQL Left join - Fixed value from Right table

我有 2 个表,分别是 A 和 B。作为现有流程的一部分,它的工作方式类似于这样

Select A.a, B.b
from A left join B
on A.c=B.C
and B.b = 'xyz'

现在,由于特定要求,我需要在 where 子句中包含 B.b = 'xyz'。像这样

Select A.a, B.b
from A left join B
on A.c=B.C
where B.b = 'xyz'

但是一旦我这样做,它就会作为内部联接工作。

我应该如何调整我的查询,以便使用 where 子句获得所需的输出。

你不能。好吧,如果在 from 子句中使用子查询就可以:

select A.a, B.b
from A left join
     (select B.*
      from B
      where B.b = 'xyz'
     ) B
     on A.c = B.C;

如果只有一行匹配,您也可以使用相关子查询::

select A.a,
       (select B.b
        from B
        where A.c = B.C and B.b = 'xyz'
       ) B
from A;

或者,您可以 "union all" 在额外的结果中:

select A.a, B.B
from A left join
     B
     on A.c = B.C
where B.b = 'xyz'
union all
select A.a, NULL
from A
where not exists (select 1 from B A.c = B.C and B.b = 'xyz')

写的很诱人:

select A.a, B.b
from A left join
     B
     on A.c = B.C
where B.b = 'xyz' or B.b is null;

但是,这不是同一个逻辑。考虑:

一个

A    C
1    1
2    2

B

B     C
xyz   1
abc   1
abc   2

左连接版本returns:

1    xyz
2    null

where版本returns:

1    xyz

“2”行被过滤掉,因为另一个值匹配。