コンテンツフレーム起動

サブクエリ 文書を SAP ライブラリストラクチャに組み込む

サブクエリは、WHERE または HAVING 句の特定条件内のサブクエリを含む特殊な SELECT 命令です。FROM 句の ON 条件でサブクエリを使用することはできません。サブクエリの構文は以下のとおりです。

( SELECT      < 結果>
    FROM      <
ソース>
    [WHERE    <
条件>]
    [GROUP BY <
項目>]
    [HAVING   <cond>]       )

上記のように、この構文には INTO または ORDER BY 句を含まないため、完全な SELECT 命令に比べると制限されています。

サブクエリをネストする、つまり、サブクエリの WHERE および HAVING 句自体にサブクエリを含むことができます。WHERE 句のネストされたサブクエリが前のクエリの項目を使用する場合、これは相関クエリといいます。このサブクエリは、前の条件を満たすデータベーステーブルの各行に対して処理されます。

スカラサブクエリ

スカラサブクエリでは、SELECT 句での選択が 1 つの列または集合式に制限されます。SELECT 句のデータ型 < 結果> は以下のようになります。

... <> [<agg>] <s>

SELECT 句の単一の項目にだけ入力することができます。

条件のサブクエリ

非スカラサブクエリ... [NOT] EXISTS < サブクエリ> 条件の WHERE または HAVING 句だけを持ちます。

サブクエリの結果セットに少なくとも 1 つの行が含まれている [1 つも含まれていない] 場合、この条件は真です。

条件のスカラサブクエリ

上記の条件に加え、追加条件でスカラサブクエリを使用することができます。

サブクエリの値のチェック

以下はスカラサブクエリの可能性のある条件です。

... <s> [NOT ] IN < サブクエリ>...

<s> が、スカラサブクエリ < サブクエリ> の結果セットに含まれている [ いない] 場合、条件は真です。

比較のスカラサブクエリ

他の条件はすべて比較であり、その演算子は WHERE のすべてのデータ型との比較のテーブルに含まれています。サブクエリ選択に含まれている行が 1 つか複数かによって違いがあります。

単一行サブクエリ

サブクエリの選択に行が 1 つだけ含まれている場合、比較に以下を使用します。

... <s> < 演算子> < サブクエリ>...

<s> の値は、サブクエリからの選択の値と比較されます。条件は真または偽です。

サブクエリには行は 1 つしか含まれず、それ以外の場合は実行時エラーが発生します。単一行サブクエリは、WHERE 句でキーを完全に定義することにより登録することができます。

複数行サブクエリ

サブクエリからの選択が複数行を返した場合は、以下のように比較を記述する必要があります。

... <s> < 演算子> ALL|ANY|SOME < サブクエリ>...

ALL プレフィクスを使用すると、サブクエリ内のすべての行に対して比較が真の場合にかぎり条件が真になります。ANY または SOME プレフィクスを使用すると、サブクエリ内の少なくとも 1 つの行に対して比較が真の場合にかぎり条件が真になります。等号演算子 (= または EQ) ANY または SOME とともに使用すると、値のチェックで IN 演算子と同じ効果があります。

サブクエリからの選択に複数行が含まれる場合に ALLANY 、または SOME データ型を使用しないと、実行時エラーが発生します。

例

相関非スカラサブクエリ:

REPORT demo_select_subquery_1.

DATA: name_tab TYPE TABLE OF scarr-carrname,
      name  LIKE LINE OF name_tab.

SELECT  carrname
  INTO  TABLE name_tab
  FROM  scarr
  WHERE EXISTS ( select  *
                   FROM  spfli
                   WHERE carrid   =  scarr~carrid AND
                         cityfrom = 'NEW YORK'        ).

LOOP AT name_tab INTO name.
   WRITE: / name.
ENDLOOP.

この例では、データベーステーブル SCARR から、ニューヨークから出発する航空会社のすべての行を選択します。

例

スカラサブクエリ:

REPORT demo_select_subquery_2.

DATA: carr_id TYPE spfli-carrid VALUE 'LH',
      conn_id TYPE spfli-connid VALUE '0400'.

DATA: city  TYPE sgeocity-city,
      lati  TYPE p DECIMALS 2,
      longi TYPE p DECIMALS 2.

SELECT  SINGLE city latitude longitude
  INTO  (city, lati, longi)
  FROM  sgeocity
  WHERE city IN ( select  cityfrom
                    FROM  spfli
                    WHERE carrid = carr_id AND
                          connid = conn_id      ).

WRITE: city, lati, longi.

この例では、データベーステーブル SGEOCITY からフライト LH 402 の出発都市の緯度および経度を読み込みます。

例

スカラサブクエリ:

REPORT demo_select_subquery_3.

DATA: wa TYPE sflight,
      plane LIKE wa-planetype,
      seats LIKE wa-seatsmax.

SELECT     carrid connid planetype seatsmax MAX( seatsocc )
  INTO     (wa-carrid, wa-connid, wa-planetype,
            wa-seatsmax, wa-seatsocc)
  FROM     sflight
  GROUP BY carrid connid planetype seatsmax
  ORDER BY carrid connid.

   WRITE: /  wa-carrid,
            wa-connid,
            wa-planetype,
            wa-seatsmax,
            wa-seatsocc.

   HIDE: wa-carrid, wa-connid, wa-seatsmax.

ENDSELECT.

AT LINE-SELECTION.

   WINDOW STARTING AT 45 3 ENDING AT 85 13.

   WRITE: 'Alternative Plane Types',
         'for', wa-carrid, wa-connid.

ULINE.

   SELECT  planetype seatsmax
    INTO  (plane, seats)
    FROM  saplane AS plane
    WHERE seatsmax < wa-seatsmax AND
          seatsmax >= ALL ( select  seatsocc
                              FROM  sflight
                              WHERE carrid = wa-carrid AND
                                    connid = wa-connid     )
    ORDER BY seatsmax.

     WRITE: / plane, seats.

ENDSELECT.

行をダブルクリックして表示される出力一覧は以下のようになります。

このグラフィックは添付のテキストに説明されています

詳細一覧には、現在割り当てられている飛行機タイプよりも座席数が少なくても、現在そのフライトを予約しているすべての乗客が登場することができるすべての飛行機タイプが表示されます。

 

 

 

 

コンテンツフレーム終了