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】INDEXC関数は文字列から特定の文字を探して位置を返す。

今回はINDEXC関数について解説します。 data data1; Id1=”1111″; Id2=”1111″; Id3=”1111″; output; Id1=”2111″; Id2=”2111″ …

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

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

【SAS】INTCK関数は指定された区間に指定された単位を何回跨ぐか数える。

data data1; Id1 =intck(“YEAR”, ’31Dec2019’d, ‘1Jan2020’d); run; 2019/12/31~2020/1/1の間に年を何回跨ぐか数える。 /* …

【SAS】SASで良く使うテクニック。その7 「条件付き書式」~差分があるセルに色を付けたい時~【Excel】

今回はSASで良く使うテクニックということで、データセットのコンペアにおいて、差分があるセルに色を付けたい時ときは「条件付き書式」が役に立つ理由を解説していきます。 (参考:【SAS】SASで良く使う …

【SAS】PUTは数値型を文字型に変換する

今回はPUTについて解説します。 /*数値8桁*/ data work.a; a = put(20061228, 8.); run; 数値型⇒文字型への変換はputを使う。数値型20061228⇒文字 …