我来说明吧:
举个列子
a表:1,2,3
b表:2,4,6
proc sql;
create table temp as
select a.date from a
where date in ( select date from b
where a.date^=b.date);
相关子查询中select的是b的date,先不考虑子查询,如果单作这个查询,那么结果是2,4,6,4,6,2,4,6,以下是原因,我来做解释:
因为这里“不等于”的连接方式是笛卡尔积,什么意思?也就是两张表的各3条记录做3×3笛卡尔积:
然后因为是“不等于”,就把不等的去除,于是去除
剩下8条observation,所以子查询返回b.date的结果是:2,4,6,4,6,2,4,6。
还没完,虽然子查询的结果包含2,但是相关子查询的运行机制并非先做子查询,再做主查询。而是逐条进行,什么意思,继续说明
首先第一条,即a表的第一条记录,date=1,代入相关子查询中,返回结果是,2,4,6,那么1不在2,4,6中,为空
其次第二条,即a表的第二条记录,date=2,代入相关子查询中,返回结果是,4,6,那么2不在4,6中,为空
最后第三条,即a表的第三条记录,date=3,代入相关子查询中,返回结果是,2,4,6,那么3不在2,4,6中,为空
所以最终结果为空。
为了加深了理解,你可以在相关子查询中返回的改为a.date,在看看结果,返回的应该是a的所有记录。