gpt4 book ai didi

sql-server - 需要更快地连接 sql server 表中的列

转载 作者:行者123 更新时间:2023-12-04 05:33:52 25 4
gpt4 key购买 nike

在 200,000 多条记录的 sqlserver 表中,我需要帮助以更快地连接按其他列分组的某些列数据。例如,样本数据和预期结果如下 .

这里我需要连接最后一列 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/

关于sql-server - 需要更快地连接 sql server 表中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12231439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com