ホームページ >データベース >mysql チュートリアル >Oracle で UPDATE ステートメントに相関サブクエリを使用するときに無限ループを回避するにはどうすればよいですか?

Oracle で UPDATE ステートメントに相関サブクエリを使用するときに無限ループを回避するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-29 02:24:11579ブラウズ

How to Avoid Infinite Loops When Using Correlated Subqueries for UPDATE Statements in Oracle?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。