欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PROC SQL(七)——SET操作符(EXCEPT)

程序员文章站 2022-07-07 20:11:40
一、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-oper...

 

一、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;

注意:

  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、第一列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)

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

使用关键字CORR和EXCEPT操作符

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

输出结果:

 PROC SQL(七)——SET操作符(EXCEPT)

其中:

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)

其中:

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