|
|
前のページ 1 2
|
|
副問い合わせ
|
副問い合わせには、結果がスカラ値になるものと単一行になるもの、および複数行になるものがありますが、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;
|
リスト4:相関副問い合わせ例
|
結果は図6のようになります。
|
商品id |
| |
商品名 |
| |
担当者名 |
| |
数量 |
-------- |
+ |
----------------------- |
+ |
---------- |
+ |
-------- |
1 |
| |
デスクトップ型パソコン |
| |
鈴木 |
| |
3 |
2 |
| |
ノート型パソコン |
| |
斎藤 |
| |
2 |
2 |
| |
ノート型パソコン |
| |
佐瀬 |
| |
2 |
3 |
| |
17型_ディスプレイ |
| |
伊藤 |
| |
3 |
5 |
| |
15型_液晶ディスプレイ |
| |
宇賀神 |
| |
5 |
(5 rows) |
|
図6:相関副問い合わせの実行結果
|
真偽値を返す副問い合わせ式
|
真偽値を返す副問い合わせ式には、次のものがあります。
- 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)
|
図7:真偽値を返す副問い合わせ式の実行結果
|
前のページ 1 2
|
|
|
|
著者プロフィール
奥畑 裕樹(OKUHATA, Hiroki)
Javaとオープンソース技術を得意とする技術コンサルタント。最近のテーマは、ソフトウェア開発の全体最適をはかること。気が付けば、10才のときにプログラミングを始めて以来、常に何かを作っている…。
|
|
|
|