副問い合わせ
副問い合わせ
副問い合わせには、結果がスカラ値になるものと単一行になるもの、および複数行になるものがありますが、Oracle、PostgreSQLともにすべてに対応していますので、基本的に変更の必要はありません。
ただし副問い合わせは、選択リストで使用する場合とFROM句内で使用する場合、およびWHERE句内で使用する場合がありますが、PostgreSQLではFROM句内の副問い合わせには、必ずエイリアスが必要なので注意しましょう。
スカラ副問い合わせの例
スカラ副問い合わせの場合は、OracleとPostgreSQLで構文は変わりません。
SELECT 商品名 FROM 商品マスタ
WHERE 卸単価 =
(SELECT MAX(卸単価) FROM 商品マスタ);FROM句内で副問い合わせを使用した例
Oracleの例は、必ずしもFROM句内の副問い合わせに別名を付ける必要はありません。しかし、PostgreSQLでは別名を付けないとエラーになります。
OracleのFROM句内の副問い合わせ
SELECT 担当者名
FROM (SELECT *
FROM 担当者マスタ
WHERE 生年月日 '1970-1-1')
WHERE MGR_ID IS NOT NULL;
Postgresの副問い合わせ
SELECT 担当者名
FROM (SELECT *
FROM 担当者マスタ
WHERE 生年月日 '1970-1-1') T
WHERE MGR_ID IS NOT NULL;
なお、この例は単純であるため、副問い合わせを使わずとも書けますが、違いを示すために使用しました。
相関副問い合わせ
PostgreSQLは、Oracle同様に相関副問い合わせもサポートしていますので、特に変更する必要はありません。相関副問い合わせとは、親文が行を処理するたびに算出される副問い合わせのことです。リスト4にその例を示します。
SELECT S.商品ID,
S.商品名,
T.担当者名,
U.数量
FROM
売上データU,
商品マスタS,
担当者マスタT
WHERE
U.商品ID = S.商品ID
AND
U.担当者ID = T.担当者ID
AND
U.数量> (SELECT
AVG(数量)
FROM
売上データ
WHERE
商品ID = U.商品ID
)
ORDER BY S.商品ID;
結果は図6のようになります。
| 商品id | | | 商品名 | | | 担当者名 | | | 数量 |
| -------- | + | ----------------------- | + | ---------- | + | -------- |
| 1 | | | デスクトップ型パソコン | | | 鈴木 | | | 3 |
| 2 | | | ノート型パソコン | | | 斎藤 | | | 2 |
| 2 | | | ノート型パソコン | | | 佐瀬 | | | 2 |
| 3 | | | 17型_ディスプレイ | | | 伊藤 | | | 3 |
| 5 | | | 15型_液晶ディスプレイ | | | 宇賀神 | | | 5 |
| (5 rows) | ||||||
真偽値を返す副問い合わせ式
真偽値を返す副問い合わせ式には、次のものがあります。
- EXISTS
- IN
- NOT IN
- ANY
- SOME
- ALL
PostgreSQL、Oracleともに、この副問い合わせ式のすべてをサポートしているので、変更の必要はありません。
真偽値を返す副問い合わせでINを使用した例です【注1】。
※注1: ただしINを使わなくても書くことはできます。
SELECT 商品名 FROM 商品マスタ
WHERE 商品ID IN
(SELECT DISTINCT 商品ID
FROM 売上データ
WHERE 処理日 BETWEEN
'2000/04/01' AND '2000/04/30');
結果は図7のようになります。
商品名
------------------------------
デスクトップ型パソコン
ノート型パソコン
19型_ディスプレイ
プリンタ
スキャナ
(5 rows)