SQL文の移行(3)

集合演算   Oracle、PostgreSQLともに集合演算の機能があります。UNION句、INTERSECT句は両方でサポートされるので変更の必要は ありません。しかし、OracleのMINUS句は、PostgreSQLでは等価なEXCEPT句に変更する必要があります。OracleでのMINU

奥畑 裕樹

2005年11月11日 20:00

集合演算

   Oracle、PostgreSQLともに集合演算の機能があります。UNION句、INTERSECT句は両方でサポートされるので変更の必要は ありません。しかし、OracleのMINUS句は、PostgreSQLでは等価なEXCEPT句に変更する必要があります。

OracleでのMINUS句の例

SELECT 担当者ID, 担当者名
   FROM 担当者マスタ
MINUS
SELECT 支店担当者ID, 支店担当者名
   FROM 支店担当者マスタ
ORDER BY 1;

PostgreSQLでのEXCEPT句の例


SELECT 担当者ID, 担当者名
   FROM 担当者マスタ
EXCEPT
SELECT 支店担当者ID, 支店担当者名
   FROM 支店担当者マスタ
ORDER BY 1;

   図11は実行結果です。

担当者id| 担当者名
----------+----------
1 | 鈴木
2 | 小野
3 | 斎藤
5 | 小林
6 | 伊藤
7 | 佐瀬
8 | 宇賀神
(7 rows)
図11:EXCEPT句の実行結果

更新のための行ロック

   Oracle、PostgreSQLともに、SELECT〜FOR UPDATEによる行ロックの機能をサポートしているので変更の必要はありません。FOR UPDATE句を使って更新用に特定の行をロックすることで、現行のトランザクションが終了するまでは、ロックした行が他のトランザクションによって更新 されたり削除されたりすることがなくなります。もちろん、「SELECT〜FOR UPDATE」を実行したときに、目的とする行のロックがすでに他のトランザクションに獲得されていることもあります。そうした場合には、すでにロックを 獲得しているトランザクションの終了を待ってロックを獲得します。

   Oracleには、そうした場合にロックを獲得しているトランザクションの終了を待たずに制御を戻す「NOWAITモード」があります。しかし PostgreSQLには、このNOWAITに相当する機能はありません。目的とする行のロックがすでに他のトランザクションに取られていると PostgreSQLでは必ずウェイトが発生しますので、使うときにはデッドロックにならないように注意しましょう。

パーティション表の移行

   Oracleには、大きな表や索引をいくつかの「パーティション」に分けて管理できる機能があります。次の例は、売上データ表が非常に大きいために年度別にパーティショニングしている際に、4月分のみのデータを抽出するSELECT文です。
 

SELECT * FROM 売上データ
   PARTITION (data2004)
   WHERE 処理日 BETWEEN
      '2004/04/01' AND '2004/04/30';

   PostgreSQLには、大きな表や索引をパーティショニングして保持できる機能はありませんが、SQL文の移行に際しては、単純にPARTITION句を削除してパーティションの指定を無視することで移行が可能です。



SELECT * FROM 売上データ
   WHERE 処理日 BETWEEN
      '2004/04/01' AND '2004/04/30';

ROWIDの移行

   OracleのROWIDに近いものとして、PostgreSQLにはOIDが存在します。し かし、OIDは基本的に、システムテーブルのプライマリキーとしての使用を前提にしています。OIDの最大値が十分に大きくないため、ユーザテーブルにお けるプライマリキーとしての使用は推奨されていませんので注意してください。

分散問い合わせの移行

   PostgreSQL本体には分散問い合わせの機能はありませんが、contrib/dblinkフォルダに同等の機能を持つdblink()関数がありますので、興味のある方は試してみるとよいでしょう。

人気記事トップ10

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

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30