Maison >base de données >tutoriel mysql >Comment puis-je mettre à jour les enregistrements de table avec les valeurs calculées à partir d'un CTE ?

Comment puis-je mettre à jour les enregistrements de table avec les valeurs calculées à partir d'un CTE ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-08 14:40:39714parcourir

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

Mise à jour efficace des enregistrements de table à l'aide des CTE

Cet article explique comment mettre à jour correctement les enregistrements de table à l'aide d'une expression de table commune (CTE) pour calculer de nouvelles valeurs. Le but est de mettre à jour la colonne DocTotal du tableau PEDI_InvoiceDetail avec un total recalculé. Une tentative précédente a échoué car les mises à jour du CTE ne se sont pas propagées à la table de base.

Le défi

La mise à jour directe d'un tableau basé sur les valeurs calculées d'un CTE entraîne souvent des erreurs. Le CTE agit comme un ensemble de résultats temporaire ; les modifications qu'il contient ne mettent pas automatiquement à jour la table sous-jacente.

La solution

La solution implique un processus en deux étapes utilisant un CTE :

<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>

Cette requête révisée :

  1. Crée un CTE : Le CTE T sélectionne InvoiceNumber, l'original DocTotal, et calcule un nouveau DocTotal (NewDocTotal) à l'aide de la fonction SUM() OVER (PARTITION BY InvoiceNumber). Cela regroupe efficacement Sale VAT pour chaque InvoiceNumber unique.

  2. Mise à jour la table de base : L'instruction UPDATE cible ensuite directement le CTE T, en définissant le DocTotal d'origine sur le NewDocTotal nouvellement calculé. Cela garantit que les modifications sont appliquées à la PEDI_InvoiceDetail table.

Concepts clés

  • OVER (PARTITION BY ...) : Cette clause cruciale divise les données par InvoiceNumber, permettant à la fonction SUM() de calculer le total de chaque facture séparément.

Cette approche fournit une méthode propre et efficace pour mettre à jour les enregistrements avec des valeurs calculées dérivées d'un CTE, évitant ainsi les pièges courants liés à la tentative de modification du CTE lui-même.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn