可以使用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>
set-operator
SELECT column-1<, ... column-n>
FROM table-1 | view-1<, ... table-n | view-n>
;
QUIT;
二、有多个set操作符:
proc sql;
select *
from table1
set-operator
select *
from table2
set-operator
select *
from table3;
quit;
1、计算每个查询以生成一个中间结果表
2、使每个中间结果表成为一个操作数,该操作数与一个set操作符链接形成一个表达式
3、如果有多个set操作符,相同优先级则先计算前两个,将结果与后面的相连接,以此类推
默认情况下,首先计算INTERSECT。
OUTER UNION, UNION, and EXCEPT具有相同优先级
4、计算整个表达式,生成单个输出结果集
1、PROC SQL消除了表中重复的、非惟一的行。
2、PROC SQL选择满足条件的行,根据要求显示列。
(以上过程proc sql 对数据进行了两次遍历。)
从表一中选择,选择第二个表中没有的唯一行。
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中的列名
proc sql;
title 'Table except all';
select *
from work.col1
except all
select *
from work.col2;
quit;
输出结果:
其中:表一没有删除重复行
proc sql;
title 'Table except corr';
select *
from work.col1
except corr
select *
from work.col2;
quit;
输出结果:
其中:
1、x是具有相同名称的列,所以只显示x列,也只匹配x列
2、第一步删除表一中的重复行
3、第二部产出与表二中的匹配行
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语句中列出表的顺序会产生影响。
功能:选择两个表共同的唯一行
功能:从两个表中选择唯一的行
举例:使用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;
功能:从两个表中选择所有行(唯一的和非唯一的)。以及所有列。
举例:使用两个带有关键字CORR的OUTER UNION操作符
proc sql;
select *
from sasuser.mechanicslevel1
outer union corr
select *
from sasuser.mechanicslevel2
outer union corr
select *
from sasuser.mechanicslevel3;
quit;