第4回:SQL文の移行(1) (2/2)

まるごと 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文の移行
PostgreSQLとOracleによるデータベース相互移行マニュアル
第1回 データベース移行
第2回 データの移行(1)
第3回 データの移行(2)
第4回 SQL文の移行(1)
第5回 SQL文の移行(2)
第6回 SSQL文の移行(3)
第7回 ファンクションの移行(1)
第8回 ファンクションの移行(2)
第9回 ストアドプロシージャの移行(1)
第10回 ストアドプロシージャの移行(2)
第11回 ストアドプロシージャの移行(3)
第12回 ストアドプロシージャの移行(4)
第13回 まとめ

人気記事トップ10

人気記事ランキングをもっと見る