ホームページ >データベース >mysql チュートリアル >共通テーブル式 (CTE) で計算された値を使用してテーブル レコードを更新するにはどうすればよいですか?

共通テーブル式 (CTE) で計算された値を使用してテーブル レコードを更新するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-08 14:36:41132ブラウズ

How Can I Update Table Records Using Values Calculated in a Common Table Expression (CTE)?

共通式を使用したレコードの更新 (CTE)

CTE を使用してテーブル レコードを更新する場合は、CTE の性質に必ず注意してください。 CTE は、定義されたクエリ中にのみ存在する一時的なコレクションです。したがって、CTE に加えられた変更はソース テーブルに直接影響しません。

この制限を克服するには、CTE に基づいてレコードを更新するための別のアプローチが必要です。効率的なアプローチは、CTE 内にサブクエリを作成して必要な値を計算することです。このサブクエリを UPDATE ステートメントで使用して、計算された値をターゲット テーブルに適用できます。

CTE で計算された値に基づいて PEDI_InvoiceDetail テーブルの DocTotal 列を更新する次の例を考えてみましょう。

<code class="language-sql">;WITH CTE_DocTotal AS
(
  SELECT InvoiceNumber, SUM(Sale + VAT) AS DocTotal
  FROM PEDI_InvoiceDetail
  GROUP BY InvoiceNumber
)</code>
この CTE は、各

InvoiceNumber を計算し、結果を一時コレクションに保存します。これらの値で DocTotal テーブルを更新するには、CTE でサブクエリを使用できます: PEDI_InvoiceDetail

<code class="language-sql">;WITH T AS
(
  SELECT InvoiceNumber,
          SUM(Sale + VAT) OVER(PARTITION BY InvoiceNumber) AS NewDocTotal
  FROM PEDI_InvoiceDetail
)
UPDATE T
SET DocTotal = NewDocTotal</code>
このサブクエリでは、

句を持つ OVER 関数が、SUM() で定義された各パーティション (グループ) に対して新しい InvoiceNumber を計算します。このサブクエリは T にエイリアスされ、計算された値で DocTotal 列を更新するために UPDATE ステートメントで使用されます。 DocTotal

このアプローチでは、CTE で計算された値に基づいて

テーブル内のレコードを効果的に更新し、変更がソース テーブルに確実に保持されるようにすることができます。 PEDI_InvoiceDetail

以上が共通テーブル式 (CTE) で計算された値を使用してテーブル レコードを更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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