我有一张有发票付款的表,可以是部分付款或全部付款。我正在将此计算字段与发票总额进行比较。我在查询中有两次,一次在Select语句中,再一次在Where子句中。即使我删除了一个,所以仅在“位置”或“选择”中,也要花一个多小时才能运行。如果我完全删除SUM,则需要10秒钟才能运行。
是否有更好的方法来求和?我应该使用索引视图吗?临时表?请注意,发票编号仅对供应商是唯一的,通常不唯一。最初的FROM是一个视图(如果有区别的话)。
select distinct
transdate,
invoicedate,
PAY.OrderAccount,
v.VendorName,
invoiceamountmst,
(select sum(PAY1.settleamountcur) from [VIEW_INVOICE_PAYMENT] PAY1 where PAY.INVOICEID=PAY1.INVOICEID and PAY.OrderAccount=PAY1.OrderAccount) as "InvoiceSUM",
settleamountcur,
Currencycodeinvoice,
PAY.Description,
Voucher
from VIEW_INVOICE_PAYMENT PAY
inner join INVOICE on INVOICE_DOC_NO =invoiceid
JOIN VENDOR V on PAY.OrderAccount=v.VendorAccount
where TRANSDATE is not null
and (select sum(PAY1.settleamountcur) from [VIEW_INVOICE_PAYMENT] PAY1 where PAY.INVOICEID=PAY1.INVOICEID and PAY.OrderAccount=PAY1.OrderAccount)=total_cost_on_invoice
答案 0 :(得分:0)
在这个答案中,当我指的是“那个选择”时,我指的是中间select sum(pay1.settlamountcur) ...
的子查询
请注意,“ that select”中的别名看起来有些奇怪,例如select sum(PAY1.settleamountcur) from [VIEW_INVOICE_PAYMENT] AX1
。 PAY1别名来自哪里?我可能错过了一些东西。如果这是您的代码中的错字,则可能是在做坏事(即使它可以运行)。假设不是,但是...
对于更广泛的问题,我相信它将为您的总体表返回的每一行运行一次select语句。确实,它可能会更频繁地执行此操作,具体取决于它何时在执行计划中进行过滤。
请注意,我在此答案中使用的是SQL Server-但它也应适用于其他数据库。
几个选项
SELECT INVOICEId, OrderAccount, SUM(settleamountcur) AS total_settleamountcur
INTO #Temp
FROM [VIEW_INVOICE_PAYMENT]
GROUP BY INVOICEId, OrderAccount
-- Add any where/having clauses you can to filter
-- Consider creating temp table first with primary key, making joins easier for SQL Server
然后使用#Temp表代替该选择子查询。