MSSQL的一个一对多查询的效率问题
是财务类的问题,费用都写入Ch_fee表,使用随机数GID主键。
一个费用的提交收付申请、结算动作 都是写入ch_fee_do里面的,里面包含有动作代码CATEGORY和Ch_fee.GID,
一个申请或一个结算内涉及的多条费用都会有一个相同的申请单号或者结算单号 这个单号都是BILLNO
每次费用结算都是存储于 ch_fee_settlement 表内,里面有结算单号BILLNO,还有生成凭证时的凭证号VOUNO
所以一个费用如果想知道自己的凭证号,就需要根据自己的Ch_fee.GID去找ch_fee_do里面GID相同而且CATEGORY in(1,2,8,9) 的行,再通过ch_fee_do.BILLNO去找费用结算ch_fee_settlement里面BILLNO相同的行,再看它的VOUNO
于是就有了下面这个function
create function [dbo].[F_VOUNO](@gid varchar(50))
returns nvarchar(200)
as
begin
declare @S nvarchar(200)
select @S=case isnull(@S,'') when '' then (select s.VOUNO from ch_fee_settlement s where s.BILLNO=d.billno )
else ISNULL(@S,'')+','+ (select VOUNO from ch_fee_settlement where BILLNO=d.billno) end
from ch_fee_do d where d.feeid=@gid and d.CATEGORY in(1,2,8,9)
return @S
end
GO
本意是打算在费用全列表里直接带出凭证号,然而这个函数的速度很慢,如果查询4400条费用的凭证号需要大约26秒……
于是想求问一下有没有更好的解决思路
或者如果加索引可以更快的话,要怎么加索引
谢谢……