我有两个桌子。当我在一个键匹配而另一个键不匹配的表上使用左联接来加入它们时,我仍然会收到左联接,但是当两个键不匹配时,我会收到重复项。
data Onl;
input an ssn;
datalines;
1 1
2 1
3 1
4 2
5 2
6 2
10 6
11 7
12 8
;
run;
data Off;
input an ssn;
datalines;
1 1
2 1
4 2
5 2
7 3
8 4
9 5
;
run;
proc sql;
create table test as
select
Onl.*
from
Onl
left join Off
on Onl.ssn = Off.ssn
and Onl.an ne Off.an
;
quit;
ne
条件的SQL行为是什么?我希望决赛桌由var ssn
组成,其中var an
不匹配。
预期输出的示例为:
an ssn
3 1
6 2
10 6
11 7
12 8
答案 0 :(得分:1)
proc sql
正在正确处理查询。 left join
返回第一个表中的所有行,无论第二个表中是否存在匹配项。
如果您想要不匹配的行,我建议not exists
:
select Onl.*
from Onl
where not exists (select 1
from off
where Onl.ssn = Off.ssn and
Onl.an = Off.an
);
您可以使用带有join
条件的where
来检查不匹配项:
select Onl.*
from Onl left join
Off
on Onl.ssn = Off.ssn and Onl.an = Off.an
where off.ssn is null;
答案 1 :(得分:0)
对NE运算符的评估与其他任何运算符相同。因此,您的查询是说您要匹配SSN相同而AN不相同的观测值。因此,SSN = 1和AN = 3将与两个具有SSN = 1但不具有AN = 3的观测值匹配。由于一个观测值与两个观测值匹配,因此它将输出两次。 LEFT JOIN意味着即使没有观察到SSN匹配且AN不匹配的观测值,也会输出该观测值。
也许您只想使用EXCEPT设置操作?
select ssn,an from ONL
except
select ssn,an form OFF