一、自然连接
功能:
自动从每个表中选择列来匹配行
PROC SQL标识每个表中具有相同名称和类型的列,并使用这些列作为连接条件
语法:
SELECT column-1<,...column-n>
FROM table-1 | view-1 NATURAL JOIN table-2 | view-2
<other clauses>;
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
<other clauses>;
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、如果所有的返回值都是缺失值,那么COALESCE将返回缺失值