Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS-SQL非等联接_Sql_Join_Sas_Operators - Fatal编程技术网

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如果你想知道你的期望有什么问题,你需要给出它们。