我有一个执行速度非常慢的函数。我正在使用一个数据库,我需要迁移数据,我无法控制! 理想情况下,我想直接使用一个视图,因为这个函数是由一个视图调用的,但我似乎只能通过调用一个函数来实现它。
=== 一个视图应该按顺序返回虚拟表中的任何内容。如果一个订单没有付款类型“利息”,那么余额应该是利息,如果“税”应该是税收
在现实生活中,我将拥有200000行以上,通过使用交叉应用它似乎放慢了很多。
是否有更好的方法来获取数据而不是使用CrossApply?
这里的Noddy示例(数据和数据类型对于示例的简单性而言是虚构的)
CREATE DATABASE DummyDB
GO
use DummyDB
IF object_id(N'DummyTable', 'U') IS NOT NULL
DROP TABLE DummyTable
GO
CREATE TABLE DummyTable
(
Id int,
OrderNo varchar(255),
PaymentType varchar(255),
Credit varchar(255),
Debit varchar(255),
Balance varchar(255)
)
GO
INSERT INTO [dbo].[DummyTable]([Id], [OrderNo], [PaymentType], [Credit], [Debit], [Balance])
SELECT 1, N'200', N'Interest', N'10', N'5', N'5' UNION ALL
SELECT 2, N'201', N'Deposit', N'400', N'30', N'370' UNION ALL
SELECT 3, N'202', N'Tax', N'20', N'10', N'10' UNION ALL
SELECT 4, N'202', N'Tax', N'50', N'10', N'10'
--my sample attempt not performing
use DummyDB
select * from DummyTable
Declare @OrderNo int
set @OrderNo=202
SELECT
Tax=tx.Tax,
Interest=tx1.Interest,
Deposit=tx2.Deposit
FROM DummyTable T1
CROSS APPLY(SELECT
Tax=sum(cast(T2.Balance as money))
FROM DummyTable T2
WHERE T2.OrderNo=@OrderNo
AND PaymentType='Tax')as tx
CROSS APPLY(select
Interest=sum(cast(T2.Balance as money))
FROM DummyTable T2
WHERE T2.OrderNo=@OrderNo
AND PaymentType='Interest')as tx1
CROSS APPLY(select
Deposit=sum(cast(T2.Balance as money))
FROM DummyTable T2
WHERE T2.OrderNo=@OrderNo
AND PaymentType='Deposit')as tx2
WHERE T1.OrderNo=@OrderNo
Any Suggestion of using something more efficient than cross apply?
Many thanks
答案 0 :(得分:1)
这与示例查询几乎相同。它将为您提供一行结果,其中您的查询将重复与@OrderNo
匹配的所有行的值。
select sum(case when T1.PaymentType = 'Tax' then cast(T1.Balance as money) else 0 end) as Tax,
sum(case when T1.PaymentType = 'Interest' then cast(T1.Balance as money) else 0 end) as Interest,
sum(case when T1.PaymentType = 'Deposit' then cast(T1.Balance as money) else 0 end) as Deposit
from DummyTable as T1
where T1.OrderNo = @OrderNo
顺便说一下,您应该确保表中OrderNo
的数据类型与变量@OrderNo
相同。看起来你正在处理整数,所以你应该改变表格。如果您无法做到这一点,那么如果您想在@OrderNo
上使用索引,则需要将varchar(255)
更改为OrderNo
。