!--a11y-->

サブクエリは、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 演算子と同じ効果があります。
サブクエリからの選択に複数行が含まれる場合に ALL 、ANY 、または 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.
行をダブルクリックして表示される出力一覧は以下のようになります。

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