使用 CTE 高效更新表记录
本文介绍了如何使用公共表表达式 (CTE) 正确更新表记录以计算新值。 目标是使用重新计算的总计来更新 DocTotal
表中的 PEDI_InvoiceDetail
列。 之前的尝试失败,因为对 CTE 的更新未传播到基表。
挑战
直接根据 CTE 的计算值更新表通常会导致错误。 CTE充当临时结果集;其中的更改不会自动更新基础表。
解决方案
该解决方案涉及使用 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>
修改后的查询:
创建 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中文网其他相关文章!