PEOC SQL(六)——外联接

一、自然连接

功能:

自动从每个表中选择列来匹配行

PROC SQL标识每个表中具有相同名称和类型的列,并使用这些列作为连接条件

语法:

SELECT column-1<,...column-n>
	FROM table-1 | view-1 NATURAL JOIN table-2 | view-2 
	; 
quit;

注意:

1、不要在自然连接中使用ON子句

2、在使用自然连接时,将隐含一个ON子句,匹配所有like列

3、可以使用WHERE子句对查询结果进行子集化。

4、自然联接默认以所有公共列的所有对的相等值为基础进行连接

二、外连接

功能:

返回不匹配的行和匹配的行

语法:

SELECT column-1<,...column-n> 
	FROM table-1 | view-1 LEFT JOIN | RIGHT JOIN | FULL JOIN table-2 | view-2 
	ON table1.column = table2.column 
	;
quit;

注意:

1、一次只能在两个表或视图上执行外部联接。

2、在所有三种类型的外部联接(左、右、全)中,结果行中来自不匹配行的列,被设置为缺失值。

3、WHERE子句在执行外部联接之前对各个详细信息行进行子集设置。

4、ON子句指定如何选择剩余的行进行输出。

5、

举例:

/*
使用左外联接
左外联接根据连接条件检索跨表匹配的所有行,以及左表(from子句中指定的第一个表)中不匹配的行。
*/
proc sql; 
	select * 
		from work.one left join work.two 
	on one.x=two.x ;
quit;

/*消除左外连接中的重复列*/
proc sql; 
	select one.x, a, b 
		from work.one left join work.two 
		on one.x=two.x ;
quit;

/*使用右外联接*/
proc sql; 
	select * 
		from work.one right join work.two 
		on one.x=two.x ;
quit;

/*使用完整的外联接*/
proc sql; 
	select *
		from certadv.one full join certadv.two 
		on one.x=two.x ;
quit;

复杂的外部联接:

/*
列出预定在3月份的航空公司的所有航班,以及任何可用的相应延误信息。每个航班都由航班日期和航班号来标识。输出应该显示以下数据:航班日期、航班号、目的地和延误时间(以分钟为单位)。
sasuser.Marchflights——Date, FlightNumber, Destination
Sasuser.Flightdelays——Date, FlightNumber, Destination, Delay
*/

proc sql outobs=20; 
title 'All March Flights'; 
    select m.date, m.flightnumber label='Flight Number',
           m.destination label='Left', f.destination label='Right', 
           delay label='Delay in Minutes' 
	from certadv.marchflights as m left join 
	     certadv.flightdelays as f
	on m.date=f.date and m.flightnumber=f.flightnumber 
	order by delay;
quit;

三、比较SQL联接和数据步merge

区别:

1、联接不需要对数据进行排序
      merge需要对数据进行排序

2、merge创建一个数据集
      联接创建一个报告作为输出

3、当所选变量的所有值都匹配
      当BY变量的所有值都匹配时,可以使用PROC SQL内部连接产生与merge合并相同的结果

4、当所选变量只有部分值匹配
      当BY变量的部分值匹配时,可以使用PROC SQL完全外连接产生与merge合并相同的结果

PROC SQL连接的优点:

1、PROC SQL连接不需要排序或索引表。

2、PROC SQL连接不要求连接表达式中的列具有相同的名称。

3、PROC SQL连接可以使用除等号(=)之外的比较操作符

COALESCE函数:

PROC SQL外连接在默认情况下不会覆盖这两个公共列。
要覆盖公共列,必须在PROC SQL完全外连接中使用COALESCE函数

COALESCE函数也可以与内部连接一起使用

1、语法:

SELECT COALESCE (column-1<,...column-n>) 

2、注意:

  1. 参数为要重叠的两个或多个列的名称

  2. 所有参数具有相同的数据类型

  3. 函数覆盖指定的列:
    1、按变量顺序遍历检查每个列的值
    2、返回的第一个非缺失值
    3、如果所有的返回值都是缺失值,那么COALESCE将返回缺失值

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