在SQL中的数据集拼接操作中,我使用最多的情况是左拼接,也是(Left Join),用于从第二个数据集中获取一些必要的变量。对于一些复杂的拼接,我一般就在Data步中,使用merge语句+in选项进行处理。虽然,有时候需要对数据集提前进行额外的处理,但是这样的程序可读性比较强。换句话说,SQL中的EXCEPT语句还是比较少的频率使用的。
EXCEPT操作是SQL中的一个数据集操作(set-operator ),作用是获取只在第一个查询中出现的记录,如下图所示:
具体的语法如下:
select columns from table
except
select columns from table;
这个操作与Data步中merge的if a and not b;
是一个作用,按理说,对于同一个效果,只需要了解一个方法就好,没必要了解多个。但是,在一种特定的情况下,我比较喜欢使用SQL中EXCEPT来处理数据集。
举例说明,一个受试者有多条检测值记录,这时候要求如果受试者只要有一条检测记录满足某种条件就从分析人群中剔除。这个逻辑并不复杂,在Data步中可以添加条件语句将符合条件的记录删选出来,然后使用Proc Sort语句进行对受试者ID去重,最后将这个去重后的数据集与源数据拼接(if a and not b;
)筛选出分析人群。
这样的操作,如果使用EXCEPPT操作就比较简洁了:
proc sql noprint;
select distinct subjid from a
except
select distinct subjid from a where xxx;
quit;
当然,不管使用何种方法,只要能够实现要求的效果都是推荐的。代码的简洁只是锦上添花,只要结果正确,不简洁也没什么大不了。
以上。