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”行被过滤掉,因为另一个值匹配。
我有 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”行被过滤掉,因为另一个值匹配。