我有以下CTE,它将为我提供整个发票的DocTotal.
;WITH CTE_DocTotal
AS
(
SELECT SUM(Sale + VAT) AS DocTotal
FROM PEDI_InvoiceDetail
GROUP BY InvoiceNumber
)
UPDATE PEDI_InvoiceDetail
SET DocTotal = CTE_DocTotal.DocTotal
Run Code Online (Sandbox Code Playgroud)
现在有了这个结果,我想在PEDI_InvoiceDetail中输入DocTotal值列.
我知道不会工作,我知道我错过了什么,它是什么?
我正在尝试使用sql表实现FIFO队列.
我有以下SQL(修改后发布),连接和参数使用对此过程的工作方式很重要.
With cte as (
select top(1) q.* from queue q with (readpast)
inner join MyTable a on q.id = a.myTableID AND myTable.procID = @myParam
order by q.Data asc
)
delete from cte
output
deleted.ID,
deleted.col1
Run Code Online (Sandbox Code Playgroud)
运行此语句将返回错误'视图或函数'cte'不可更新,因为修改会影响多个基表.
我理解为什么会抛出错误,我无法弄清楚如何解决它.任何建议将不胜感激!
与派生表/子查询/临时表等方法相比,CTE如何以及为什么提供更好的性能?
临时数据库中发生任何临时计算.因此,如果我们有一个游标方法,它还会在临时数据库中创建临时表/工作表,一旦操作结束,该工作表就会被销毁.我对CTE的理解是,它也做同样的事情(或者它是否会在内存中创建临时结果?从而提高性能)那为什么它比上面的方法更好,比如游标/派生表/子查询/临时表等?