我有2个表,分别是A和B。作为现有流程的一部分,它的工作原理如下
Select A.a, B.b
from A left join B
on A.c=B.C
and B.b = 'xyz'
现在,由于特定的要求,我需要在where子句中使用Bb ='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;
或者,您可以“合并全部”额外的结果:
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 C
xyz 1
abc 1
abc 2
左联接版本返回:
1 xyz
2 null
该where
版本的回报:
1 xyz
因为存在另一个值匹配项,所以将“ 2”行过滤掉。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句