ホームページ >データベース >mysql チュートリアル >Oracle で UPDATE ステートメントに相関サブクエリを使用するときに無限ループを回避するにはどうすればよいですか?
Oracle での結合クエリによる更新: 相関更新の処理
Oracle では、相関サブクエリを使用して更新クエリを実行すると、予期しない動作が発生する可能性がありますサブクエリが 1 行も返さない場合はエラーになります。次のクエリについて考えてみましょう:
UPDATE table1 t1 SET (t1.col, t1.Output) = ( SELECT t2.col, t3.Output + t2.col FROM tabl2 t3 LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key WHERE t2.col is not NULL);
問題:
サブクエリが table1 の各行に対して複数の行を返す可能性があるため、指定されたクエリは無期限に実行されます。このシナリオでは、Oracle は table1 の各行を複数回更新しようとするため、無限ループが発生します。
解決策:
この問題を解決するには、次のことを行う必要があります。サブクエリは、更新される table1 の各行に対して 1 つの行を返すようにします。 1 つのアプローチは、table1 の行をサブクエリの行に関連付ける条件を追加することです。
UPDATE table1 t1 SET (t1.col,t1.Output) = ( SELECT t2.col, t3.Output + t2.col FROM tabl2 t3 LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key WHERE t2.col is not NULL AND t1.some_key = t2.some_key);
この変更されたクエリでは、追加の条件 t1.some_key = t2.some_key により、一致する行のみが
さらに、クエリが意図しているかどうかを検討する価値があります。 table1 内のすべての行、またはそのサブセットのみを更新します。サブクエリの結果に基づいて特定の行のみを更新することが目的の場合は、追加のフィルタリング基準を UPDATE 句に追加できます。
以上がOracle で UPDATE ステートメントに相関サブクエリを使用するときに無限ループを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。