CTE を使用したテーブル レコードの効率的な更新
この記事では、共通テーブル式 (CTE) を使用してテーブル レコードを正しく更新し、新しい値を計算する方法について説明します。 目標は、DocTotal
テーブルの PEDI_InvoiceDetail
列を再計算された合計で更新することです。 CTE への更新がベース テーブルに伝播されなかったため、前回の試行は失敗しました。
チャレンジ
CTE の計算値に基づいてテーブルを直接更新すると、多くの場合エラーが発生します。 CTE は一時的な結果セットとして機能します。その内部で変更を加えても、基になるテーブルは自動的に更新されません。
解決策
この解決策には、CTE を使用する 2 段階のプロセスが含まれます。
<code class="language-sql">;WITH T AS ( SELECT InvoiceNumber, DocTotal, SUM(Sale + VAT) OVER (PARTITION BY InvoiceNumber) AS NewDocTotal FROM PEDI_InvoiceDetail ) UPDATE T SET DocTotal = NewDocTotal;</code>
この改訂されたクエリ:
CTE を作成します: CTE T
は、元の InvoiceNumber
である DocTotal
を選択し、DocTotal
関数を使用して新しい NewDocTotal
(SUM() OVER (PARTITION BY InvoiceNumber)
) を計算します。これにより、一意の Sale VAT
ごとに InvoiceNumber
が効率的に集約されます。
ベース テーブルを更新します: 次に、UPDATE
ステートメントは CTE T
を直接ターゲットにし、元の DocTotal
を新しく計算された NewDocTotal
に設定します。 これにより、変更が PEDI_InvoiceDetail
テーブルに確実に適用されます。
主要な概念
OVER (PARTITION BY ...)
: この重要な句はデータを InvoiceNumber
で分割し、SUM()
関数が各請求書の合計を個別に計算できるようにします。このアプローチは、CTE から導出された計算値でレコードを更新するクリーンで効率的な方法を提供し、CTE 自体を変更しようとする一般的な落とし穴を回避します。
以上がCTE からの計算値を使用してテーブル レコードを更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。