SAS

Proc sqlを極める(4) ーサブクエリー

proc sqlの第4回目です。今回はサブクエリについて。

サブクエリとは

クエリは入れ子にして書くことができます。
内側のクエリでデータを抽出し、外側のクエリはその抽出結果を取得してクエリを実行することができます。
この内側のクエリがサブクエリと呼ばれるものです。

使用例

例1

例えばデータセット2からデータセット1に含まれる症例番号に合致するレコードを抽出する場合を考えます。

データセット1

 
Obsusubjidlbcataval
1a0111.1
2a1121.4
3a02124.1
4a1222000.0
5b0113.0
6b1121.2
7b22150.0
8b2221800.0
9c3213.2
10c5220.5

データセット2

 
Obsusubjidsubgroupscore
1a0115
2a1424
3a2319
4a4021
5b0712
6b1126
7b2917
8b8328
9c3813
10c5228

SASだとこう書きます。
一度2つのデータセットをマージしinオプションで両方のデータセットに含まれるレコードを抽出します。

proc sort data=ds1; by usubjid;
run; 

proc sort data=ds2; by usubjid;
run; 

data result; 
merge ds1(in=a keep=usubjid) ds2(in=b ); 
by usubjid; 

if a and b; 
run;

proc sqlだとこうなります。

proc sql; 
create table result2 as 
   select * from ds2 
   where usubjid in (select usubjid from ds1); 
quit;

where句のカッコの中がサブクエリです。サブクエリでデータセット1のusubjidを取得し、where句でデータセット2のusubjidと比較しているわけです。

さらにデータセット1の症例のうちlbcat=2となる症例と合致するレコードを、データセット2から抽出する場合はこうなります。

proc sql; 
create table result2 as 
select * 
from ds2 
where usubjid in (
   select usubjid 
   from ds1 
   where lbcat=2); 

quit;

ソートだけならSASでも同様の処理はできるので積極的にSQLで置き換えるメリットは乏しいですが、今回のケースのように別テーブルに含まれる症例のレコードを抽出する場合は、SQLのほうが直感的に書けると思います。