作成しているアプリで複数のデータベースをサポートしようとしています。このアプリは主にHibernateを使用しますが、DMLステートメントがほんのわずかな時間で処理できる場合、数百万を超える行を繰り返し処理して個別に処理するのは非常に非効率的です。したがって、特定の操作では、SQLを作成する必要があります。私はMySQLの人間ですが、これまでのところ、SQLServerとMySQLで動作するアプリを持っています。私を困惑させた操作が1つあり、Oracleの更新クエリの一部を作成する方法がわからないようです。オラクルに関する限り、これはおそらく初心者の質問であることを私は知っていますが、私が探していたとき、私は明白な答えを逃したに違いありません。
MySQL用にこのタイプのクエリを作成する方法は次のとおりです。
table1 t1、table2 t2 set t1.colA = t2.colAを更新します。ここで、t1.colB=t2.colBおよびt1.colC=t2.colCです。
MySQLには、エイリアスを使用して'set'ステートメントの前にすべてのテーブルを指定できる優れた構造があります。これにより、ステートメントの残りの部分が大幅に簡素化されます。SQL Serverでは、update...joinを使用して同じことを行います。
Oracleでは、'update table1 set colA =(select ....)where presents(select ....)構文を使用しようとしましたが、これは機能しません-'サブクエリは複数の行を返します' エラー。また、構文で... using ...を使用してマージを使用しようとしましたが、「ソーステーブルから安定した行のセットを取得できません」というエラーが発生します。
私が達成しようとしていることをさらに説明するために、実行するクエリがいくつかあります。そのうちのいくつかは2つのテーブルを使用し、いくつかは3つのテーブルを使用します。最も複雑なものはこれを行う必要があります:
tableA.colBをtableC.colCの値で更新します。ここで、一致するすべての行についてtableA.colA=tableB.colAおよびtableB.colB=tableC.colBです。データの観点から、これは次のようになります(前と後):
Before:
Table A
-------
colA colB
1 NULL
2 NULL
3 NULL
4 NULL
Table B
-------
colA colB
1 A
2 A
3 B
4 B
Table C
-------
colB colC
A 15
B 20
After:
Table A
-------
colA colB
1 15
2 15
3 20
4 20
これが十分に明確であることを願っています。Oracle用にこの種のDMLクエリを作成する方法を誰かが説明できますか?ボーナスポイントについては、PostgreSQLでも同じですか?:)