一个业务场景,客户下了1个订单,出货的时候1个订单分了多次出货,出货单号存于表A,订单号数据存于表B,表A存有表B的ddid用于关联,统计报表要显示订单号对应的多次出货单,数据如下:
| 表A | 表B ddid |
| 出货号 | 订单号 |
| PL001 | SC001 |
| PL002 | SC001 |
| PL003 | SC001 |
| PL004 | SC002 |
| PL005 | SC002 |
| PL006 | SC002 |
要显示的结果如下:
| 订单号 | 对应的出货单号 |
| SC001 | PL001、PL002、PL003 |
| SC002 | PL004、PL005、PL006 |
报表需要多个订单号要在一个字段中,之前在网上查到使用stuff + for xml path的形式拼接字段,如下
select B.订单号,对应的出货单号 = stuff((select ',',isnull(A.出货单号,'')
from A where A.ddid = B.ddid for xml path('')) ,1,1,'')
from B
但是使用这个有个问题是,数据量小的时候还可以,数据量大的时候会变卡,影响性能,所以决定使用标量值函数
USE [你的数据库名]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create function [dbo].[你的标量值函数名](@传入参数名 As Varchar(40))
Returns Varchar(500)
As
BEGIN
Declare @s As Varchar(500)
Set @s=''
Begin
select @s=@s+'、'+ISNULL(C.出货单号,'') From
(Select A.出货单号 From A Where A.ddid = @传入参数名 ) C
END
Return Stuff(@s,1,1,'')
End
调用标量值函数
select B.订单号,对应的出货单号 = dbo.创建的函数('ddid')
from B
这篇博客讨论了一个在大数据量下如何优化SQL查询的问题。当需要将订单号与对应的多个出货单号拼接成一个字段时,传统的STUFF + FORXMLPATH方法在数据量大时性能下降。为了解决这个问题,作者提出了使用标量值函数的方法,通过创建自定义函数来提高查询效率。这种方法在大数据场景下能显著提升报表生成的速度。
283

被折叠的 条评论
为什么被折叠?



