SAS-SQL非等联接
我有两张桌子。当我在表上使用左连接连接它们时,其中一个键匹配,另一个键不匹配,我仍然会收到左连接,但如果两个键不匹配,我会收到重复的连接SAS-SQL非等联接,sql,join,sas,operators,Sql,Join,Sas,Operators,我有两张桌子。当我在表上使用左连接连接它们时,其中一个键匹配,另一个键不匹配,我仍然会收到左连接,但如果两个键不匹配,我会收到重复的连接 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
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
proc sql
正在正确处理查询。left join
返回第一个表中的所有行,无论第二个表中是否有匹配项
如果需要不匹配的行,我建议不存在
:
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的两个观测值相匹配。因此,一个观测值将输出两次,因为它匹配两个观测值。左连接意味着,即使没有SSN匹配且AN不匹配的观测值,也会输出该观测值 也许您只是想使用EXCEPT set操作
select ssn,an from ONL
except
select ssn,an form OFF
你说的“复制品”是什么意思。如果右表中有三个观测值与左表中的观测值相匹配,则该观测值将出现三次。如果您只是从左表中提取变量,那么DISTINCT关键字将消除重复项,包括消除原始左表中的任何重复项。如果我在SAS中执行此连接,我将收到两行值
3,1
和两行值6,2
。当表Onl
中原来只有一行,而表Off
中根本不包含这些值时,为什么有两行包含这些值?我知道一些变通办法。我只是从来没有使用过与ne
的连接,我对结果很好奇。我不知道你为什么说这些值不存在。前两行的SSN均为1,且任意一行的AN值均不是3。所以这正是您所要求的。了解LEFT JOIN ON返回的内容:行上的内部联接将所有不匹配的左表行合并为null扩展。始终知道作为外部联接的一部分,您需要什么样的内部联接。left join如何工作是一个常见问题。在考虑发帖之前,请始终用谷歌搜索你的错误消息或你的问题/问题/目标的许多清晰、简洁和准确的措辞,有/没有你的特定字符串/名称和网站:stackoverflow.com和标签,并阅读许多答案。如果你发布一个问题,用一句话作为标题。请参见文本上方的投票箭头(&S)。PS请通过编辑澄清,而不是评论。请在代码问题中给出一个--cut&paste&runnable代码;示例输入(作为初始化代码)以及所需和实际输出(包括逐字错误消息);标签和版本;清晰的说明和解释。这包括您能给出的最少代码,即您显示为OK的代码,由您显示为not OK的代码扩展。(调试基础。)用于包含DBMS/product和DDL的SQL,其中包括约束和索引以及表格格式初始化。PS如果你想知道你的期望有什么问题,你需要给出它们。