【发布时间】:2022-01-12 12:02:34
【问题描述】:
表 t1 的主键为 NUMBER,我们必须使用表 t2 的行设置属性 A、B、C、...,因此使用 PIVOT。
此查询的执行时间超过 4 小时。
有什么办法可以改善吗?
DECLARE @number [varchar](40)
DECLARE cursor CURSOR FOR
SELECT DISTINCT(t1.NUMBER)
FROM [TABLE1] t1
INNER JOIN [TABLE2] t2
ON t1.NUMBER = t2.NUMBER
OPEN cursor
BEGIN TRANSACTION
FETCH NEXT FROM cursor INTO @number
WHILE(@@FETCH_STATUS = 0)
BEGIN
UPDATE t1
SET A = piv.A,
B= piv.B,
C= piv.C, ...
FROM
(SELECT A, B, C, ...
FROM
(SELECT VALUE, NAME
FROM t2
WHERE NUMBER = @number
) d
PIVOT
(MAX(VALUE)
FOR NAME IN (A, B, C, ...
) p
) AS piv
WHERE t1.NUMBER = @number
FETCH NEXT FROM cursor INTO @number
END
COMMIT TRANSACTION
【问题讨论】:
-
摆脱
WHILE将是一个重要的开始。你为什么用一个? SQL 是一种基于集合的语言,它可以轻松处理在单个语句中插入超过 100 万行。 -
为什么这需要一个游标,没有什么不能作为一个单一的基于集合的更新来完成,这可能会快一个数量级。
标签: sql sql-server pivot database-cursor