TOP書籍連動> 副問い合わせ
まるごと PostgreSQL!
PostgreSQLとOracleによるデータベース相互移行マニュアル

第4回:SQL文の移行(1)
著者:奥畑 裕樹(OKUHATA, Hiroki)   2005/10/27
前のページ  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)
著者プロフィール
奥畑 裕樹(OKUHATA, Hiroki)
Javaとオープンソース技術を得意とする技術コンサルタント。最近のテーマは、ソフトウェア開発の全体最適をはかること。気が付けば、10才のときにプログラミングを始めて以来、常に何かを作っている…。


INDEX
第4回:SQL文の移行(1)
  タイトル
SQL文の移行