SQL左边连接过滤器不使用过滤器

时间:2014-06-24 15:21:04

标签: sql left-join

在此代码段中:

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个过滤器。这是为什么?

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