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 ?
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 :
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.
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!