并非所有值都从左连接中列出
Not all values getting listed from left join on condition
有人可以帮助理解为什么没有列出左侧 table 的所有值。
我也尝试过 ANSI 左连接和外连接。
在使用条件 -
时,我也需要在最终输出中列出 cust_3
b.cust_id != 'cust_3'
可能是一些我无法全神贯注的琐碎事情,希望得到反馈。
架构设置 -
create table cust(cust_id varchar2(10));
create table prod(cust_id varchar2(10), prod_id varchar2(10));
insert into cust values('cust_1');
insert into cust values('cust_2');
insert into cust values('cust_3');
insert into cust values('cust_4');
insert into cust values('cust_5');
insert into prod values('cust_5','prod1');
insert into prod values('cust_5','prod2');
insert into prod values('cust_4','prod2');
insert into prod values('cust_4','prod1');
insert into prod values('cust_1','prod1');
insert into prod values('cust_1','prod2');
insert into prod values('cust_1','prod');
insert into prod values('cust_1','prod3');
insert into prod values('cust_2','prod3');
insert into prod values('cust_2','prod1');
insert into prod values('cust_2','prod4');
insert into prod values('cust_2','prod6');
insert into prod values('cust_2','prod8');
insert into prod values('cust_2','prod7');
insert into prod values('cust_2','prod9');
commit;
select a.cust_id,b.prod_id from cust a, prod b where a.cust_id=b.cust_id(+) and b.cust_id != 'cust_3';
CUST_ID PROD_ID
---------- ----------
cust_5 prod1
cust_5 prod2
cust_4 prod2
cust_4 prod1
cust_1 prod1
cust_1 prod2
cust_1 prod
cust_1 prod3
cust_2 prod3
cust_2 prod1
cust_2 prod4
cust_2 prod6
cust_2 prod8
cust_2 prod7
cust_2 prod9
15 rows selected.
我正在寻找的输出 -
CUST_ID PROD_ID
---------- ----------
cust_5 prod1
cust_5 prod2
cust_4 prod2
cust_4 prod1
cust_1 prod1
cust_1 prod2
cust_1 prod
cust_1 prod3
cust_2 prod3
cust_2 prod1
cust_2 prod4
cust_2 prod6
cust_2 prod8
cust_2 prod7
cust_2 prod9
cust_3 NULL
您的最终过滤条件 b.cust_id != 'cust_3'
意味着它将只查找条件为真且 NULL
的行(当 OUTER
连接未找到match) 永远不等于任何东西,因此它有效地将您的查询从 LEFT OUTER JOIN
转换为 INNER JOIN
.
如果要修复它,请将过滤器添加到左外连接条件:
select a.cust_id,
b.prod_id
from cust a,
prod b
where a.cust_id = b.cust_id(+)
and b.cust_id (+) != 'cust_3';
而且,更好的是,使用 ANSI 连接语法:
select a.cust_id,
b.prod_id
from cust a
LEFT OUTER JOIN prod b
ON ( a.cust_id = b.cust_id
AND b.cust_id != 'cust_3' );
db<>fiddle here
有人可以帮助理解为什么没有列出左侧 table 的所有值。 我也尝试过 ANSI 左连接和外连接。
在使用条件 -
时,我也需要在最终输出中列出 cust_3 b.cust_id != 'cust_3'
可能是一些我无法全神贯注的琐碎事情,希望得到反馈。
架构设置 -
create table cust(cust_id varchar2(10));
create table prod(cust_id varchar2(10), prod_id varchar2(10));
insert into cust values('cust_1');
insert into cust values('cust_2');
insert into cust values('cust_3');
insert into cust values('cust_4');
insert into cust values('cust_5');
insert into prod values('cust_5','prod1');
insert into prod values('cust_5','prod2');
insert into prod values('cust_4','prod2');
insert into prod values('cust_4','prod1');
insert into prod values('cust_1','prod1');
insert into prod values('cust_1','prod2');
insert into prod values('cust_1','prod');
insert into prod values('cust_1','prod3');
insert into prod values('cust_2','prod3');
insert into prod values('cust_2','prod1');
insert into prod values('cust_2','prod4');
insert into prod values('cust_2','prod6');
insert into prod values('cust_2','prod8');
insert into prod values('cust_2','prod7');
insert into prod values('cust_2','prod9');
commit;
select a.cust_id,b.prod_id from cust a, prod b where a.cust_id=b.cust_id(+) and b.cust_id != 'cust_3';
CUST_ID PROD_ID
---------- ----------
cust_5 prod1
cust_5 prod2
cust_4 prod2
cust_4 prod1
cust_1 prod1
cust_1 prod2
cust_1 prod
cust_1 prod3
cust_2 prod3
cust_2 prod1
cust_2 prod4
cust_2 prod6
cust_2 prod8
cust_2 prod7
cust_2 prod9
15 rows selected.
我正在寻找的输出 -
CUST_ID PROD_ID
---------- ----------
cust_5 prod1
cust_5 prod2
cust_4 prod2
cust_4 prod1
cust_1 prod1
cust_1 prod2
cust_1 prod
cust_1 prod3
cust_2 prod3
cust_2 prod1
cust_2 prod4
cust_2 prod6
cust_2 prod8
cust_2 prod7
cust_2 prod9
cust_3 NULL
您的最终过滤条件 b.cust_id != 'cust_3'
意味着它将只查找条件为真且 NULL
的行(当 OUTER
连接未找到match) 永远不等于任何东西,因此它有效地将您的查询从 LEFT OUTER JOIN
转换为 INNER JOIN
.
如果要修复它,请将过滤器添加到左外连接条件:
select a.cust_id,
b.prod_id
from cust a,
prod b
where a.cust_id = b.cust_id(+)
and b.cust_id (+) != 'cust_3';
而且,更好的是,使用 ANSI 连接语法:
select a.cust_id,
b.prod_id
from cust a
LEFT OUTER JOIN prod b
ON ( a.cust_id = b.cust_id
AND b.cust_id != 'cust_3' );
db<>fiddle here