在20万只加记录一个SQLServer表,我需要与其他列分组一些列数据的速度更快Concat的帮助。 例如, 样本数据和预期的结果如下所示 。
在这里,我需要Concat的最后一栏ColumnA, ColumnB, ColumnC
作为管道分隔字符串,这四个一样的组合:
where KeyNumber=@strKeyNumber and Action=@strAction and Type=@strType and Code=@strCode
这四个是不同的组合。
我编写这个使用T-SQL STUFF功能,但实在是太慢了。 我还与while循环不同编码的,但即使是太慢了。
所以,我需要得到更快的结果帮。
在这些列A,B,C中的数据是长字符串,所以串联的字符串应该是类型nvarchar(max)
。
表中的原始数据(副本可以有一些列):
ID KeyNumber Action Type Code ColumnA ColumnB ColumnC
1 1111111111 AC1 TYPE1 CODE1 ValueA1 ValueB1 ValueC1
2 1111111111 AC1 TYPE1 CODE1 ValueA2 ValueB2 ValueC2
3 1111111111 AC1 TYPE1 CODE1 ValueA2 ValueB2 ValueC3
4 1111111111 AC1 TYPE1 CODE1 ValueA3 ValueB3 ValueC4
5 2222222222 AC2 TYPE2 CODE2 ValA1 ValB1 ValC1
6 2222222222 AC2 TYPE2 CODE2 ValA2 ValB2 ValC2
7 2222222222 AC2 TYPE2 CODE2 ValA3 ValB3 ValC3
8 2222222222 AC2 TYPE2 CODE2 ValA4 ValB4 ValC4
9 2222222222 AC2 TYPE2 CODE2 ValA4 ValB5 ValC4
需要(在上面的表格应该不在这里重复重复的值)的结果数据到新表象下面这样:
ID KeyNumber Action Type Code ColumnA ColumnB ColumnC
1 1111111111 AC1 TYPE1 CODE1 ValueA1|ValueA2|ValueA3 ValueB1|ValueB2|ValueB3 ValueC1|ValueC2|ValueC3|ValueC4
2 2222222222 AC2 TYPE2 CODE2 ValA1|ValA2|ValA3|ValA4 ValB1|ValB2|ValB3|ValB4|ValB5 ValC1|ValC2|ValC3|ValC4
您可以检查这一项:
DECLARE @Table TABLE
(
ID BIGINT,
Keynumber BIGINT,
[Action] CHAR(3),
[Type] CHAR(5),
Code CHAR(5),
ColumnA NVARCHAR(MAX),
ColumnB NVARCHAR(MAX),
ColumnC NVARCHAR(MAX)
)
INSERT INTO @TABLE(ID,Keynumber,[Action],[Type],Code,ColumnA,ColumnB,ColumnC)
VALUES (1,1111111111,'AC1','TYPE1','CODE1','ValueA1','ValueB1','ValueC1')
,(2,1111111111,'AC1','TYPE1','CODE1','ValueA2','ValueB2','ValueC2')
,(3,1111111111,'AC1','TYPE1','CODE1','ValueA2','ValueB2','ValueC3')
,(4,1111111111,'AC1','TYPE1','CODE1','ValueA3','ValueB3','ValueC4')
,(5,2222222222,'AC2','TYPE2','CODE2','ValA1','ValB1','ValC1')
,(6,2222222222,'AC2','TYPE2','CODE2','ValA2','ValB2','ValC2')
,(7,2222222222,'AC2','TYPE2','CODE2','ValA3','ValB3','ValC3')
,(8,2222222222,'AC2','TYPE2','CODE2','ValA4','ValB4','ValC4')
,(9,2222222222,'AC2','TYPE2','CODE2','ValA4','ValB5','ValC4')
SELECT Keynumber
,[Action]
,[Type]
,Code
,(
SELECT ColumnA AS [text()]
FROM @Table TableOne
WHERE TableOne.Keynumber = TableTwo.Keynumber and TableOne.[Action] = TableTwo.[Action] and TableOne.[Type] = TableTwo.[Type]
ORDER BY TableOne.ColumnA
FOR XML PATH(''), TYPE
).value('/', 'NVARCHAR(MAX)') AS ColumnA
,(
SELECT ColumnB AS [text()]
FROM @Table TableOne
WHERE TableOne.Keynumber = TableTwo.Keynumber and TableOne.[Action] = TableTwo.[Action] and TableOne.[Type] = TableTwo.[Type]
ORDER BY TableOne.ColumnB
FOR XML PATH(''), TYPE
).value('/', 'NVARCHAR(MAX)') AS ColumnB
,(
SELECT ColumnC AS [text()]
FROM @Table TableOne
WHERE TableOne.Keynumber = TableTwo.Keynumber and TableOne.[Action] = TableTwo.[Action] and TableOne.[Type] = TableTwo.[Type]
ORDER BY TableOne.ColumnC
FOR XML PATH(''), TYPE
).value('/', 'NVARCHAR(MAX)') AS ColumnC
FROM(
SELECT DISTINCT Keynumber,[Action],[Type],Code
FROM @Table
) TableTwo
另外,我不知道你是用什么方法字符串连接。 您可以检查这个网站的其他方法:
http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/
您是否知道CodePlex上有用户定义的聚合GROUP_CONCAT .Installation的一个开放源代码的CLR实现是你的服务器上运行的SQL脚本一样简单。
http://groupconcat.codeplex.com/
它有4个GROUP_CONCAT实施,是返回NVARCHAR(MAX)
GROUP_CONCAT --default定界符是,(逗号)
GROUP_CONCAT_D - 你可以指定分隔符
GROUP_CONCAT_DS - 你可以指定分隔符,排序顺序(1为递增顺序,2为倒序)
GROUP_CONCAT_S - 您可以指定排序顺序
我觉得这是在性能方面非常不错。
在你的榜样,你会使用这样的
SELECT Keynumber
,[Action]
,[Type]
,Code
,dbo.GROUP_CONCAT_DS(ColumnA,'|',1) AS ColumnA
,dbo.GROUP_CONCAT_DS(ColumnB,'|',1) AS ColumnB
,dbo.GROUP_CONCAT_DS(ColumnC,'|',1) AS ColumnC
FROM YourTable
GROUP BY
Keynumber
,[Action]
,[Type]
,Code