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> 
		 
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. 只在最后一个select语句末尾加分号
  2. 两个查询中相对位置相同的列,必须具有相同的数据类型
    否则SAS日志中生成一条警告消息并停止执行
    ERROR: Column 1 from the first contributor of EXCEPT is not the same type as its counterpart from the second
  3. 第一个查询中表的列名称为输出表的列名

关键字:

  • 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;

输出结果:

PROC SQL(七)——SET操作符(EXCEPT)_第1张图片

其中:

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;

输出结果:

 PROC SQL(七)——SET操作符(EXCEPT)_第2张图片

其中:表一没有删除重复行

使用关键字CORR和EXCEPT操作符

proc sql; 
	title 'Table except corr';
	select * 
		from work.col1 
	except corr 
	select * 
		from work.col2; 
quit;

输出结果:

 PROC SQL(七)——SET操作符(EXCEPT)_第3张图片

其中:

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;

输出结果:

 PROC SQL(七)——SET操作符(EXCEPT)_第4张图片

其中:

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;

 

你可能感兴趣的:(proc,sql)