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

CTE からの計算値を使用してテーブル レコードを更新するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-08 14:40:39
オリジナル
671 人が閲覧しました

How Can I Update Table Records with Calculated Values from a CTE?

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>
ログイン後にコピー

この改訂されたクエリ:

  1. CTE を作成します: CTE T は、元の InvoiceNumber である DocTotal を選択し、DocTotal 関数を使用して新しい NewDocTotal (SUM() OVER (PARTITION BY InvoiceNumber)) を計算します。これにより、一意の Sale VAT ごとに InvoiceNumber が効率的に集約されます。

  2. ベース テーブルを更新します: 次に、UPDATE ステートメントは CTE T を直接ターゲットにし、元の DocTotal を新しく計算された NewDocTotal に設定します。 これにより、変更が PEDI_InvoiceDetail テーブルに確実に適用されます。

主要な概念

  • OVER (PARTITION BY ...): この重要な句はデータを InvoiceNumber で分割し、SUM() 関数が各請求書の合計を個別に計算できるようにします。

このアプローチは、CTE から導出された計算値でレコードを更新するクリーンで効率的な方法を提供し、CTE 自体を変更しようとする一般的な落とし穴を回避します。

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

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