SAS-SQL非设备联接

我有两个桌子。当我在一个键匹配而另一个键不匹配的表上使用左联接来加入它们时,我仍然会收到左联接,但是当两个键不匹配时,我会收到重复项。

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
boh333 回答:SAS-SQL非设备联接

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;
,

对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
本文链接:https://www.f2er.com/3157076.html

大家都在问