SQL 左连接 - 来自右表的固定值

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 子句获得所需的输出。

Gor*_*off 5

你不能。好吧,如果您在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”行被过滤掉,因为另一个值匹配。