サブクエリと update および delete 句の実行に関する Oracle の動作はどうなっているのだろうか。
私はオラクルのだろうか:
- サブクエリを実行し、行ごとに更新句と削除句を実行します
- 更新用のサブクエリを実行してから、削除用のサブクエリを実行します
- 1) および 2) では、オプティマイザーが最適な戦略を選択します。
- 他の?
編集:
DB 使用: Oracle 11.2.0.3.0 私はこのきれいなクエリを持っています
DROP TABLE T1; DROP TABLE IT1; テーブル OT1 をドロップします。 テーブル T1 の作成 ( ID整数、 V整数、 ピボット整数 ); テーブル IT1 の作成 ( ID 整数 ); テーブル OT1 の作成 ( ID整数、 FOO 整数、 NV 整数 ); T1 (ID、V、PIVOT) 値 (1,1,1) に挿入します。 T1 (ID、V、PIVOT) 値 (2,1,1) に挿入します。 IT1 (ID) 値 (1) に挿入します。 IT1 (ID) 値 (2) に挿入します。 OT1 (ID,NV,FOO) 値 (1,2,0) に挿入します。 OT1 (ID,NV,FOO) 値 (2,2,0) に挿入します。 専念; ( を使用して T1 ターゲットにマージ 個別の T1.ID、T1.V、OT1.NV を選択 T1から 内部結合 IT1 オン T1.ID = IT1.ID OT1.ID = IT1.ID の左外部結合 OT1 WHERE T1.PIVOT = 1 または OT1.FOO=40) SRC オン (SRC.ID = TARGET.ID) 一致した場合 UPDATE SET TARGET.V=SRC.NV DELETE WHERE TARGET.V=SRC.V; 専念;
アイテムに新しいバージョンがある場合、アイテムは新しいバージョンで更新されます (UPDATE 句)。そうでない場合、アイテムは破棄されます (DELETE 句)。削除は行われるべきではありません
このステートメントは、期待どおりに機能しません。すべてのリンクを削除します。削除句が変更されたデータでサブクエリを実行するようなものでした。
ここでは役に立たないが、問題を引き起こしているように見える OT1.FOO=40 に注意してください。order by
サブクエリに (順序基準に関係なく) を追加すると、ステートメントは正しく機能します。
ありがとう、
ニコラス