在此代码段中:
proc sql;
create table test3 (id numeric (10));
create table test4 (id numeric (10));
quit;
proc sql;
insert into test3 (id) values (1);
insert into test3 (id) values (2);
insert into test3 (id) values (2);
insert into test4 (id) values (1);
insert into test4 (id) values (2);
create table test5 as
select * from test3 left join test4 on test3.id = test4.id
and test3.id<> 2 and test4.id <> 2;
quit;
我试图从test3获取所有行,即使test4上没有匹配的行,前提是test3和test4中的id列&lt;&gt; 2的值....也就是在最终输出中,我不知道不希望id = 2记录,甚至不想一次。
但上述联接正在给出:
1
2
2
好像&lt;&gt;根本没有2个过滤器。这是为什么?
答案 0 :(得分:2)
这是有问题的查询:
select *
from test3 left join
test4
on test3.id = test4.id and
test3.id <> 2 and test4.id <> 2;
left join
保留第一个表中的所有行以及第二个表中的所有匹配行。如果第一个表中给定行没有匹配的行,则保留该行。
换句话说,当您执行left join
时,第一个表的on
子句中的过滤器无效。您应该将此条件移至where
子句:
select *
from test3 left join
test4
on test3.id = test4.id and
test4.id <> 2
where test3.id <> 2;
答案 1 :(得分:1)
尝试:
create table test5 as
select * from test3 left join test4 on test3.id = test4.id
WHERE test3.id<> 2 and test4.id <> 2;
您的join子句包含and
,可能会创建一个联合。更改为where
。