query 式

テーブルからデータを取得します。

参照項目:インラインビュー
クエリ式(サブクエリ)
table-expression 構成要素

構文

必須引数

table-expression

table-expression 構成要素を参照してください。

オプション引数

set-operator

is one of the following:

INTERSECT <CORRESPONDING> <ALL>
OUTER UNION <CORRESPONDING>
UNION <CORRESPONDING> <ALL>
EXCEPT <CORRESPONDING> <ALL>

詳細

クエリ式とテーブル式

クエリ式は、1つ以上のテーブル式です。複数のテーブル式は、セット演算子によって結合されます。次の図は、テーブル式とクエリ式の間の関係を示しています。

テーブル式とクエリ式の間の関係

セット演算子

PROC SQLには、次の集合演算子が用意されています。

OUTER UNION

クエリ結果を連結します。

UNION

両方のクエリ結果から、すべて一意の行を生成します。

EXCEPT

最初のクエリ結果のみに含まれる行を生成します。

INTERSECT

両方のクエリ結果に共通する行を生成します。

セット演算子を含むクエリ式は、次のように評価されます。

  • それぞれのテーブル式が評価されて、内部で中間的な結果テーブルが生成されます。
  • 各中間結果テーブルは、セット演算子で結ばれたオペランドとなり、式を構成します(たとえば、A UNION B)。
  • クエリ式に3つ以上のテーブル式が含まれる場合、最初の2つのテーブル式の結果は、次のセット演算子とオペランドのためのオペランドになります。たとえば、(A UNION B) EXCEPT C、((A UNION B) EXCEPT C) INTERSECT D、などです。
  • クエリ式を評価することによって、1つの出力テーブルが生成されます。

式の中のセット演算子は、かっこによって無効にしない限り、次の優先順位の順序に従います。INTERSECTが最初に評価されます。OUTER UNION、UNIONおよびEXCEPTの優先順位は同じです。

PROC SQLは、テーブル式で参照されるテーブルまたはビューの列の数が異なる場合でも、集合演算を実行します。このように動作する理由は、次のとおりです。SQLのANSI規格では、集合演算に関与するテーブルまたはビューの列の数が同じである必要があり、それらの列のデータ型が一致している必要があります。連結されている1つ以上のテーブルまたはビューよりも列数が少ないテーブルまたはビューに対して集合演算を実行した場合、PROC SQLは、適切なデータ型の欠損値を含む列を作成することによって、列が足りないテーブルまたはビューを拡張します。この一時的な変更によって、集合演算を正しく実行することができます。

CORRESPONDING (CORR)キーワード

CORRESPONDINGキーワードは、セット演算子指定した場合にのみ使用します。CORRを指定すると、PROC SQLは、列の位置ではなく、名前によってテーブル式の列を照合します。名前が一致しない列は、OUTER UNION演算子の場合を除き、結果テーブルから除外されます。OUTER UNION演算子を参照してください。

たとえば、2つのテーブル式に対して集合演算を実行した場合、PROC SQLは、1つのテーブル式で最初に指定されたcolumn-name(SELECT句に記述されたcolumn-name)と、もう1つのテーブル式で最初に指定されたcolumn-nameを照合します。CORRを省略した場合、PROC SQLは、列の位置によって列を照合します。

関連項目

ALLキーワード

セット演算子は、出力テーブルから重複する行を自動的に削除します。オプションのALLキーワードを指定すると、重複行が維持され、実行ステップが1つ減ります。これによって、クエリ式のパフォーマンスが向上します。一意の行のみではなく、テーブル式の実行結果のすべての行を表示する場合に、このキーワードを使用します。ALLキーワードは、セット演算子も指定した場合にのみ使用します。

OUTER UNION演算子

OUTER UNIONの実行は、SETステートメントを使用したSAS DATAステップの実行と非常によく似ています。OUTER UNIONは、テーブル式の中間結果を連結します。したがって、1番目のテーブル式によって生成されたすべての行に、2番目のテーブル式によって生成されたすべての行が連結されて、クエリ式の結果テーブルに格納されます。同じ名前の列は、別の列として結果テーブルに含まれます。

たとえば、次のクエリ式は、ME1テーブルとME2テーブルを連結しますが、類似する名前を持つ列を重ね合わせません。ME1テーブルとME2テーブルのOUTER UNIONに、結果を示します。

data me1;
   input IDnum $ Jobcode $ Salary Bonus;
   datalines;
1400   ME1         29769  587
1403   ME1         28072  342
1120   ME1         28619  986
1120   ME1         28619  986
;

data me2;
   input IDnum $ Jobcode $ Salary;
   datalines;
1653   ME2         35108
1782   ME2         35345
1244   ME2         36925
;

ME1テーブルとME2テーブル

ME1 and ME2 Tables
proc sql;
   title 'ME1 and ME2: OUTER UNION';
   select *
      from me1
   outer union
   select *
      from me2;
quit;

ME1テーブルとME2テーブルのOUTER UNION

Outer Union of ME1 and ME2 Tables

OUTER UNIONセット演算子を使用したテーブルの連結は、和結合の実行に類似しています。詳細については、和結合を参照してください。

同じ名前を持つ列を重ね合わせるには、CORRESPONDINGキーワードを使用します。

proc sql;
   title 'ME1 and ME2: OUTER UNION CORRESPONDING';
   select *
      from me1
   outer union corr
   select *
      from me2;
quit;

OUTER UNION CORRESPONDING

Outer Union Corresponding

連結によって得られたテーブルについて、次の点に注目してください。

  • OUTER UNION CORRESPONDINGは、一致しないすべての列を維持します。
  • 同じ名前を持つ列については、1番目のテーブル式の結果から値が欠損している場合、2番目のテーブル式の同じ名前の列の値が挿入されます。
  • 結果テーブルにすべての行を含めることがOUTER UNION演算子のデフォルトのアクションであるため、この演算子ではALLキーワードは使用されません。そのため、IDnumが1120であるテーブルME1の両方の行が出力に表示されます。

UNION演算子

UNION演算子は、両方のテーブル式から得られた、すべて一意の行を含むテーブルを生成します。つまり、出力テーブルには、1番目のテーブル式、2番目のテーブル式、または両方のテーブル式から生成された行が含まれます。

列は、列名とは無関係に、テーブル内の位置によって追加されます。ただし、対応する列のデータ型は一致している必要があります。そうでない場合、結合は実行されません。PROC SQLは、警告メッセージを発行して実行を停止します。

出力テーブルの列の名前は、1番目のテーブル式の列に名前がない場合(式などの場合)を除き、1番目のテーブル式の列の名前になります。1番目のテーブル式の列に名前がない場合、出力テーブルの列名は、2番目のテーブル式のそれぞれの列の名前になります。

次の例では、PROC SQLによって2つのテーブルを結合しています。

proc sql;
   title 'ME1 and ME2: UNION';
   select *
      from me1
   union
   select *
      from me2;
quit;

ME1テーブルとME2テーブルのUNION

Union of ME1 and ME2 Tables

次の例では、ALLを指定して、ME1の重複行を含めています。さらに、ALLは、PROC SQLに1つのパスのみを実行するよう指定することによって、順序を変更します。そのため、ME2の値は、ME1の値に単純に追加されます。

proc sql;
   title 'ME1 and ME2: UNION ALL';
   select *
      from me1
   union all
   select *
      from me2;
quit;

UNION ALL

Union All

その他の例については、2つのテーブルを組み合わせるを参照してください。

UNION CORRによって異なる変数長を解決する方法

同じ名前の1つ以上の文字変数の長さが異なるソース上で、UNIONまたはOUTER UNIONと共にCORRが使用される場合、出力テーブル内の変数の長さは、寄与するソースの種類に基づいて決定されます。説明のために、2つのソースが使用され、各ソースに異なる長さの文字変数VAR1が含まれているとします。ここで、次のSQLプロシジャステップについて考えます。

proc sql;
   create table NewTable as
      select * from Source_A
      outer union corr
      select * from Source_B;
quit;

source_AおよびSource_Bには、データセット、DATAステップビューまたはSQLビューを指定できます。VAR1などの文字変数にはデフォルトの長さが使用されます。次のテーブルに、さまざまなソースを使用した場合のテーブルNewTableのVAR1の長さの決定方法を示します。

同一変数の長さが異なる場合の解決

Source_Aの種類

Source_Bの種類

NewTableのVAR1の長さ

データセットまたはDATAステップビュー

データセットまたはDATAステップビュー

NewTableのVAR1の長さは、両方のソースにわたるVAR1の最大長です。

データセットまたはDATAステップビュー

SQLビュー

SQLビューでVAR1の長さが明示的に指定されている場合、NewTableのVAR1の長さは、ソースの順序に関係なく、SQLビューで指定された長さになります。それ以外の場合、NewTableのVAR1の長さは、両方のソースにわたるVAR1の最大長です。

SQLビュー

SQLビュー

NewTableのVAR1の長さは次のように決定されます。

  • どちらのSQLビューもVAR1の長さを明示的に指定しない場合、NewTableのVAR1の長さは、両方のソースにわたるVAR1の最大長となります。
  • 1つのSQLビューのみがVAR1の長さを明示的に指定している場合、NewTableのVAR1の長さは、ソースの順序に関係なく、そのSQLビューで指定されている長さになります。
  • 両方のSQLビューでVAR1の長さを明示的に指定した場合、NewTableのVAR1の長さは最初のSQLビュー(Source_A)で指定された長さになります。

次の表に、例をいくつか示します。

Source_Aの種類

Source_A VAR1の長さ

Source_Bの種類

Source_B VAR1の長さ

NewTableのVAR1の長さ

データセット

18

DATAステップビュー

36

36

データセット

58

SQLビュー

361

58

データセット

58

SQLビュー

362

36

SQLビュー

182

SQLビュー

362

18

1 VAR1の長さはSQLビューで指定されていないため、デフォルトの長さが使用されます。
2 VAR1の長さはSQLビューで明示的に指定されます。例については、テーブルとSQLビューの組み合わせを参照してください。

SQLプロシジャステップでは、いずれかまたは両方のSELECT句でLENGTH=を使用してVAR1の長さを明示的に指定した場合、テーブルNewTableのVAR1の長さは次のように決定されます。

  • 特定のSELECT句でVAR1のLENGTH=が指定されている場合、NewTableでのVAR1の長さは、そのSELECT句で指定された長さになります。
  • 両方のSELECT句でVAR1のLENGTH=が指定されている場合、NewTableのVAR1の長さは、最初のSELECT句で指定された長さとなります。

これらのルールは、ソースの種類に関係なく適用されます。たとえば、次のSQLプロシジャステップについて考えてみます。

proc sql;
   create table NewTable as
      select * from Source_A
      outer union corr
      select VAR1 length=18, ... from Source_B;
quit;

この場合、Source_AのVAR1の長さがより長い場合でも、NewTableのVAR1の長さは18です。Source_AのVAR1の長さが18より大きい場合、Source_AのVAR1値は18に切り捨てられます。

EXCEPT演算子

1番目のテーブル式のEXCEPT演算子は、2番目のテーブル式の結果を除く、一意の行を含む出力テーブルを生成します。1番目のテーブル式の中間結果に、2番目のテーブル式の中間結果に含まれない行が少なくとも1つ出現した場合、1番目のテーブル式のその行が結果テーブルに含まれます。

次の例のIn_USAテーブルには、アメリカ内外の都市への航空便が含まれています。Out_USAテーブルには、アメリカ以外の都市への航空便のみが含まれています。

data in_usa;
   input Flight $ Dest $;
   datalines;
145 ORD
156 WAS
188 LAX
193 FRA
207 LON
;
data out_USA;
   input Flight $ Dest $;
   datalines;
193 FRA
207 LON
311 SJA
;

EXCEPTの例のソーステーブル

In_USA and Out_USA Tables

次の例では、Out_USAに含まれていないIn_USAの行のみが返されます。

proc sql;
    title 'Flights from In_USA Only';
    select * from in_usa
    except
    select * from out_usa;
quit;

In_USAのみの航空便

Flights from In_USA Only

INTERSECT演算子

INTERSECT演算子は、両方のテーブルに共通する行を含む出力テーブルを生成します。たとえば、次の例では、上で示したIn_USAテーブルとOut_USAテーブルを使用して、両方のテーブルに含まれる行を返しています。

proc sql;
    title 'Flights from Both In_USA and Out_USA';
    select * from in_usa
    intersect
    select * from out_usa;
quit;

In_USAとOut_USAの両方の航空便

Flights from Both In_USA and Out_USA
最終更新: 2026年4月14日