PROC SQL(七)——SET操作符(EXCEPT)
一、SET操作符
功能:
可以使用SET操作符组合两个或多个查询的结果。
SET操作符有以下4个:
EXCEPT、INTERSECT、UNION、OUTER UNION
语法:
一、只有一个set操作符:
PROC SQL;
SELECT column-1<, ... column-n>
FROM table-1 | view-1<, ... table-n | view-n>
<optional query clauses>
set-operator <ALL> <CORR>
SELECT column-1<, ... column-n>
FROM table-1 | view-1<, ... table-n | view-n>
<optional query clauses>;
QUIT;
二、有多个set操作符:
proc sql;
select *
from table1
set-operator
select *
from table2
set-operator
select *
from table3;
quit;
注意:
- 只在最后一个select语句末尾加分号
- 两个查询中相对位置相同的列,必须具有相同的数据类型
否则SAS日志中生成一条警告消息并停止执行
ERROR: Column 1 from the first contributor of EXCEPT is not the same type as its counterpart from the second - 第一个查询中表的列名称为输出表的列名
关键字:
- ALL:显示所有重复的行
PROC SQL不会再次遍历数据以消除重复行。效率更高
OUTER UNION操作符不允许使用 - CORR:两个表中,具有相同名称的列会被显示。
当与EXCEPT、INTERSECT和UNION一起使用时,删除两个表中名称不相同的任何列,只显示相同名称的列;并且第一个表中,没有出现在第二个表中的所有唯一行。
当与OUTER UNION一起使用时,同名的列被覆盖,并显示名称不匹配的列而不重叠
在proc sql的处理过程:
1、计算每个查询以生成一个中间结果表
2、使每个中间结果表成为一个操作数,该操作数与一个set操作符链接形成一个表达式
3、如果有多个set操作符,相同优先级则先计算前两个,将结果与后面的相连接,以此类推
默认情况下,首先计算INTERSECT。
OUTER UNION, UNION, and EXCEPT具有相同优先级
4、计算整个表达式,生成单个输出结果集
处理显示唯一行:
1、PROC SQL消除了表中重复的、非惟一的行。
2、PROC SQL选择满足条件的行,根据要求显示列。
(以上过程proc sql 对数据进行了两次遍历。)
二、EXCEPT操作符的使用
功能:
从表一中选择,选择第二个表中没有的唯一行。
单独使用EXCEPT操作符
data col1;
input x a $;
datalines;
1 a
1 a
1 b
2 c
3 v
4 e
6 g
;
run;
data col2;
input x b $;
datalines;
1 x
2 y
3 z
3 v
5 w
;
run;
proc sql;
title 'Table except';
select *
from work.col1
except
select *
from work.col2;
quit;
输出结果:
其中:
1、第一列x都是数值型变量
2、第二列a,b都是字符型变量
3、使用了col1中的列名
使用关键字ALL和EXCEPT操作符
proc sql;
title 'Table except all';
select *
from work.col1
except all
select *
from work.col2;
quit;
输出结果:
其中:表一没有删除重复行
使用关键字CORR和EXCEPT操作符
proc sql;
title 'Table except corr';
select *
from work.col1
except corr
select *
from work.col2;
quit;
输出结果:
其中:
1、x是具有相同名称的列,所以只显示x列,也只匹配x列
2、第一步删除表一中的重复行
3、第二部产出与表二中的匹配行
使用关键字ALL和CORR和EXCEPT操作符
proc sql;
title 'Table except all corr';
select *
from work.col1
except all corr
select *
from work.col2;
quit;
输出结果:
其中:
1、x是具有相同名称的列,所以只显示x列,也只匹配x列
2、不会删除表1中重复行
3、当关键字ALL与EXCEPT操作符一起使用时,不能从输出中删除表Col1中的一行,除非它在表Col2中有单独的匹配行。
举例:
proc sql;
select firstname,lastname
from sasuser.staffchanges
except all
select firstname,lastname
from sasuser.staffmaster;
quit;
/*****调换select中表的顺序*******/
proc sql;
select firstname,lastname
from sasuser.staffmaster
except all
select firstname,lastname
from sasuser.staffchanges;
quit;
1、如果已知表中没有重复行,则需要使用ALL关键字,这样防止proc sql 对数据进行二次遍历
2、在使用EXCEPT操作符的set操作中,SELECT语句中列出表的顺序会产生影响。
三、INTERSECT操作符
功能:选择两个表共同的唯一行
四、UNION操作符
功能:从两个表中选择唯一的行
举例:使用UNION操作符和摘要函数
proc sql;
select sum(pointsearned) format=comma12. label='Total Points Earned',
sum(pointsused) format=comma12. label='Total Points Used',
sum(milestraveled) format=comma12. label='Total Miles Traveled'
from sasuser.frequentflyers;
quit;
proc sql;
title 'Points and Miles Traveled';
title2 'by Frequent Flyers';
select 'Total Points Earned:', sum(PointsEarned) format=comma12.
from sasuser.frequentflyers
union
select 'Total Points Traveled:', sum(MilesTraveled) format=comma12.
from sasuser.frequentflyers
union
select 'Total Points Used:', sum(PointsUsed) format=comma12.
from sasuser.frequentflyers ;
quit;
五、OUTER UNION操作符
功能:从两个表中选择所有行(唯一的和非唯一的)。以及所有列。
举例:使用两个带有关键字CORR的OUTER UNION操作符
proc sql;
select *
from sasuser.mechanicslevel1
outer union corr
select *
from sasuser.mechanicslevel2
outer union corr
select *
from sasuser.mechanicslevel3;
quit;
本文地址:https://blog.****.net/weixin_44450031/article/details/107138162