Sag*_*hia 2 sql snowflake-cloud-data-platform
我有 2 个表说 A 和 B。作为现有流程的一部分,它的工作原理是这样的
Select A.a, B.b
from A left join B
on A.c=B.C
and B.b = 'xyz'
Run Code Online (Sandbox Code Playgroud)
现在,由于特定要求,我需要在 where 子句中包含 Bb = 'xyz'。像这样的东西
Select A.a, B.b
from A left join B
on A.c=B.C
where B.b = 'xyz'
Run Code Online (Sandbox Code Playgroud)
但是一旦我这样做,它就可以作为一个内部连接。
我应该如何调整我的查询,以便使用 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;
Run Code Online (Sandbox Code Playgroud)
如果只有一行匹配,您也可以使用相关子查询:
select A.a,
(select B.b
from B
where A.c = B.C and B.b = 'xyz'
) B
from A;
Run Code Online (Sandbox Code Playgroud)
或者,您可以在额外结果中“联合所有”:
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')
Run Code Online (Sandbox Code Playgroud)
写起来很诱人:
select A.a, B.b
from A left join
B
on A.c = B.C
where B.b = 'xyz' or B.b is null;
Run Code Online (Sandbox Code Playgroud)
然而,这不是同一个逻辑。考虑:
一种
A C
1 1
2 2
Run Code Online (Sandbox Code Playgroud)
乙
B C
xyz 1
abc 1
abc 2
Run Code Online (Sandbox Code Playgroud)
左连接版本返回:
1 xyz
2 null
Run Code Online (Sandbox Code Playgroud)
该where版本的回报:
1 xyz
Run Code Online (Sandbox Code Playgroud)
“2”行被过滤掉,因为另一个值匹配。