并非所有值都从左连接中列出

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