我目前正在 Delphi 中开发一个应用程序,它使用 SQL 来接入 3rd 方发票系统的后端,以便我们可以扩展它的报告功能。我认为自己在编程的 delphi 方面相当精通,但是 SQL 对我来说是新的,所以在这个论坛和其他资源的巨大帮助下,我已经设法自学了比我想象的更多的东西。
大部分数据都是从几个表中提取的(我对那方面没有意见,所以我不会用这些细节堵塞帖子),但是我在获取成本价格时遇到了问题。它存储在一个跟踪历史成本价格的表中,因此对于每种产品(16'000+),可能有数百条记录,但是我只需要最接近(<=)发票日期的每种产品的成本. 这是功能:
CREATE FUNCTION dbo.CostAtDate ( @costdate AS datetime , @product AS int )
RETURNS decimal(18,2)
AS
BEGIN
DECLARE @result decimal(18,2)
SET @result = (
Select Top 1
BASE_InventoryCostLogDetail.AverageCostAfter
From
BASE_InventoryCostLogDetail
Where
CreatedDttm < @costdate And CreatedDttm > DATEADD(month,-1,@costDate) And
ProdId = @product
Order By
CreatedDttm Desc)
RETURN @result
END
这是其中一个查询(有几个不同的查询,但都基于相同的结构):
Select
BASE_Customer.Name,
SO_SalesOrder.OrderNumber,
SO_SalesOrderInvoice_Line.Description,
SO_SalesOrderInvoice_Line.UnitPrice,
Case SO_SalesOrderInvoice_Line.ItemTaxCodeId
When '100' Then (SO_SalesOrderInvoice_Line.UnitPrice / 11) * 10
Else SO_SalesOrderInvoice_Line.UnitPrice End As exgst,
SO_SalesOrderInvoice_Line.QuantityUom,
SO_SalesOrderInvoice_Line.QuantityDisplay,
Case SO_SalesOrderInvoice_Line.QuantityUom
When 'cases.' Then dbo.CostAtDate(SO_SalesOrder.OrderDate,
SO_SalesOrderInvoice_Line.ProdId) * BASE_Product.SoUomRatioStd
Else dbo.CostAtDate(SO_SalesOrder.OrderDate,
SO_SalesOrderInvoice_Line.ProdId) End As cost,
Case SO_SalesOrderInvoice_Line.QuantityUom
When 'cases.' Then ((dbo.CostAtDate(SO_SalesOrder.OrderDate,
SO_SalesOrderInvoice_Line.ProdId) * BASE_Product.SoUomRatioStd) / 11) * 10
Else (dbo.CostAtDate(SO_SalesOrder.OrderDate,
SO_SalesOrderInvoice_Line.ProdId) / 11) * 10 End As exgstcost,
BASE_Product.SoUomRatioStd,
BASE_Product.Name As Name1,
SO_SalesOrder.OrderDate
From
BASE_Customer Inner Join
SO_SalesOrder On SO_SalesOrder.CustomerId = BASE_Customer.CustomerId
Inner Join
SO_SalesOrderInvoice_Line On SO_SalesOrderInvoice_Line.SalesOrderId =
SO_SalesOrder.SalesOrderId Inner Join
BASE_Product On SO_SalesOrderInvoice_Line.ProdId = BASE_Product.ProdId
Where
SO_SalesOrder.OrderDate Between '20131028' And '20131029'
现在,当我在所选范围内只有几张发票时,这可以正常工作,但鉴于它每条记录至少调用该函数 3 次,当我在超过天(我们经常需要涵盖两周的报告)。
不幸的是,鉴于它是第三方产品(任何好奇的人都可以使用流入库存),我无法更改表结构。
有没有办法使用更有效的连接、派生表(我理解这个概念,但从未这样做过),甚至重写整个查询来大大提高性能?