ホームページ > データベース > mysql チュートリアル > Ora-00933を避けるために、Oracleにインナーが結合してテーブルを正しく更新する方法は?

Ora-00933を避けるために、Oracleにインナーが結合してテーブルを正しく更新する方法は?

Barbara Streisand
リリース: 2025-01-25 04:51:09
オリジナル
920 人が閲覧しました

How to Correctly Update Tables with Inner Joins in Oracle to Avoid ORA-00933?

INNER JOIN を使用した Oracle UPDATE: ORA-00933 の回避

内部結合を使用して Oracle テーブルを更新する場合、一般的なエラーは ORA-00933: 「SQL コマンドが正しく終了しませんでした。」です。 これは、間違った構文を使用することで発生します。 MySQL などの他のデータベースで使用される標準の UPDATE ... INNER JOIN ... SET ... 構文は、Oracle では直接機能しません。

問題とオラクルの解決策

問題のある構文は次のようになります:

<code class="language-sql">UPDATE table1
INNER JOIN table2 ON table1.value = table2.DESC
SET table1.value = table2.CODE
WHERE table1.UPDATETYPE='blah';</code>
ログイン後にコピー

Oracle には別のアプローチが必要です。 正しい方法は次のとおりです:

<code class="language-sql">UPDATE table1 SET table1.value = (SELECT table2.CODE
                                  FROM table2 
                                  WHERE table1.value = table2.DESC)
WHERE table1.UPDATETYPE='blah'
AND EXISTS (SELECT table2.CODE
            FROM table2 
            WHERE table1.value = table2.DESC);</code>
ログイン後にコピー

これは、サブクエリを使用して更新の table2.CODE 値を取得し、EXISTS 句を使用して、一致する行が table2 に存在する場合にのみ更新が行われるようにします。これにより、存在しない値を使用して更新しようとすることによって発生するエラーが防止されます。

代替方法: インライン ビュー

もう 1 つのオプションには、インライン ビューの使用が含まれます。

<code class="language-sql">UPDATE 
(SELECT table1.value as OLD, table2.CODE as NEW
 FROM table1
 INNER JOIN table2
 ON table1.value = table2.DESC
 WHERE table1.UPDATETYPE='blah'
) t
SET t.OLD = t.NEW;</code>
ログイン後にコピー

このメソッドが成功するかどうかは、Oracle がインライン ビューを更新可能とみなすかどうかにかかっており、これは特定のデータベース ルールによって管理されます。 通常、前の方法の方が信頼性が高くなります。 ニーズに最も適した方法を選択し、常に徹底的にテストしてください。

以上がOra-00933を避けるために、Oracleにインナーが結合してテーブルを正しく更新する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート