SAS SQL サブクエリ

【SAS】サブクエリについて解説

投稿日:2023年10月15日 更新日:

今回はSQLのfrom句にサブクエリを使用した場合の動きについて、解説します。

[from句]

まずは通常のSQLプロシージャから。


/* サブクエリ(from句_1) */
data data1;
  Id1=1111; Id2=1111; Id3=1111;
    output;
  Id1=2222; Id2=2222; Id3=2222;
    output;
  Id1=3333; Id2=3333; Id3=3333;
    output;
run;


proc sql;
  select *
  from data1;
quit;
  • 正常にSQLプロシージャが実行される。

/* サブクエリ(from句_2) */
data data1;
  Id1=1111; Id2=1111; Id3=1111;
    output;
  Id1=2222; Id2=2222; Id3=2222;
    output;
  Id1=3333; Id2=3333; Id3=3333;
    output;
run;


proc sql;
  select *
  from (
    select *
    from data1
  )
quit;
  • from句にSQL文を埋め込める。(サブクエリ)
  • 正常にSQLプロシージャが実行される。

/* サブクエリ(from句_3) */
data data1;
  Id1=1111; Id2=1111; Id3=1111;
    output;
  Id1=2222; Id2=2222; Id3=2222;
    output;
  Id1=3333; Id2=3333; Id3=3333;
    output;
run;


proc sql;
  select a1.*
  from (
    select *
    from data1
  ) a1;
quit;
  • from句にSQL文を埋め込める。(サブクエリ)
  • サブクエリの抽出結果により、作成したテーブルをa1としている。
  • 正常にSQLプロシージャが実行される。

[select句]

まずは通常のSQLプロシージャから。


/* サブクエリ(from句_1) */
data data1;
  Id1=1111; Id2=1111; Id3=1111;
    output;
  Id1=2222; Id2=2222; Id3=2222;
    output;
  Id1=3333; Id2=3333; Id3=3333;
    output;
run;


proc sql;
  select *
  from data1;
quit;
  • 正常にSQLプロシージャが実行される。

/* サブクエリ(select句_2) */
data data1;
  Id1=1111; Id2=1111; Id3=1111;
    output;
  Id1=2222; Id2=2222; Id3=2222;
    output;
  Id1=3333; Id2=3333; Id3=3333;
    output;
run;


proc sql;
  select 
    Id1
    ,Id2
    ,(
      select Id3
      from data1
    )
  from data1;
quit;
  • select句にSQL文を埋め込める。(サブクエリ)
  • data1テーブルからId3のみを切り出し、小テーブルとしてから、Id1・Id2とくっつける。
  • select句でサブクエリを使う時は、サブクエリは1行ずつ返さないとエラーとなる。(今回は3行返している)

/* サブクエリ(select句_3) */
data data1;
  Id1=1111; Id2=1111; Id3=1111;
    output;
  Id1=2222; Id2=2222; Id3=2222;
    output;
  Id1=3333; Id2=3333; Id3=3333;
    output;
run;


proc sql;
  select 
    Id1
    ,Id2
    ,(
      select Id3
      from data1
      where Id3 = 1111
    )
  from data1;
quit;
  • select句にSQL文を埋め込める。(サブクエリ)
  • data1テーブルからId3のみを切り出し、小テーブルとしてから、Id1・Id2とくっつける。
  • select句でサブクエリを使う時は、サブクエリは1行ずつ返さないとエラーとなる。(今回は1行ずつ返しているため、成功)

[where句]


/* サブクエリ(where句_1) */
data data1;
  Id1=1111; Id2=1111; Id3=1111;
    output;
  Id1=2222; Id2=2222; Id3=2222;
    output;
  Id1=3333; Id2=3333; Id3=3333;
    output;
run;


proc sql;
  select *
  from data1
  where Id1 = 1111;
quit;
  • 正常にSQLプロシージャが実行される。(where句を用いたSQL文)

/* サブクエリ(where句_2) */
data data1;
  Id1=1111; Id2=1111; Id3=1111;
    output;
  Id1=2222; Id2=2222; Id3=2222;
    output;
  Id1=3333; Id2=3333; Id3=3333;
    output;
run;


proc sql;
  select *
  from data1
  where Id1 = (
                select Id1
                from data1
                where Id1=1111
  );
quit;
  • where句にSQL文を埋め込める。(サブクエリ)
  • data1テーブルからId1=1111のみを切り出し、小テーブルとしてから、where条件として扱う。
  • where=句でサブクエリを使う時は、サブクエリは1行返さないとエラーとなる。(今回は1行返しているため、成功)

/* サブクエリ(where句_3) */
data data1;
  Id1=1111; Id2=1111; Id3=1111;
    output;
  Id1=2222; Id2=2222; Id3=2222;
    output;
  Id1=3333; Id2=3333; Id3=3333;
    output;
run;


proc sql;
  select *
  from data1
  where Id1 = (
                select Id1
                from data1
  );
quit;
  • where句にSQL文を埋め込める。(サブクエリ)
  • data1テーブルからId1のみを切り出し、小テーブルとしてから、where条件として扱う。
  • where=句でサブクエリを使う時は、サブクエリは1行返さないとエラーとなる。(今回は3行返しているため、エラー)

/* サブクエリ(where句_4) */
data data1;
  Id1=1111; Id2=1111; Id3=1111;
    output;
  Id1=2222; Id2=2222; Id3=2222;
    output;
  Id1=3333; Id2=3333; Id3=3333;
    output;
run;


proc sql;
  select *
  from data1
  where Id1 IN (
                select Id1
                from data1
  );
quit;
  • where句にSQL文を埋め込める。(サブクエリ)
  • data1テーブルからId1のみを切り出し、小テーブルとしてから、where条件として扱う。
  • where in句でサブクエリを使う時は、サブクエリは複数行返しても正常に動く。
  • where in(1111, 2222, 3333)みたいな感じ。

-SAS, SQL, サブクエリ

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

【SAS】LIBNAMEステートメントはExcelファイルをライブラリとして割り当てることができる。【SAS Base Programming対策5】

今回はLIBNAMEステートメントを用いてExcelファイルをライブラリ参照する方法について触れていきます。 SAS Base Programmingの試験を2回受験しましたが、2回ともExcelファ …

【SAS】INTCK関数を使って年齢計算をする。【PUT】【SUBSTR】【IF】

今回はINTCK関数を使って、年齢計算を行う方法について解説していきたいと思います。 併わせて読みたい記事 (INTCK:【SAS】INTCK関数は指定された区間に指定された単位を何回跨ぐか数える。 …

【SAS】%MACROはマクロを定義することができる。その5 =を使うと数を渡す引数,数を受け取る引数を指定できる。【%MEND】

今回はマクロ引数に「=」を用いる方法について解説していきたいと思います。(事前に読んでおきたい記事:【SAS】%MACROはマクロを定義することができる。その3 マクロには引数を設定できる。【%MEN …

【SAS】FIRST, LASTは重複を削除しユニーク化する

今回はfirst, lastについて解説します。 /*first last1*/ data data1; 番号=”1111″; 日付=”20210331″; output; 番号=”1111″; 日付 …

【SAS】データセットのオブザベーション数で処理を分岐させる方法【IF】【NOBS】

今回は、データセットのオブザベーション数により、処理を分岐させる方法について解説していきたいと思います。 (参考:【SAS】データセットの有無で処理を分岐させる方法【%IF】【EXIST】 | ビジネ …