我的数据库表有以下列: A1、A2、A3、A4、A5、A6
每当遇到空列时,我都必须更新这些记录并将值向左移动。目的是在具有从左开始的值的列之间不存在空值。例如如果:
A1 = NULL , A2 = 1 , A3 = 4, A4 = 5, A5 = 9, A6 = 8
我必须向左移动值,结果将是:
A1 = 1, A2 = 4 , A3 = 5, A4 = 9, A5 = 8, A6 = NULL
到目前为止,我已经提出了以下查询,但速度很慢。让我知道您是否可以调整查询以使其更快。还有一件事,如果我在 C# 中执行此操作会怎样?如果我循环遍历那里的数据行并更新每一行,会更快吗?
UPDATE myTable SET
A5 = A6,
A6 = NULL
WHERE (A5 IS NULL) AND (NOT A6 IS NULL)
UPDATE myTable SET
A4 = A5,
A5 = A6
WHERE (A4 IS NULL) AND (NOT A5 IS NULL)
UPDATE myTable SET
A3 = A4,
A4 = A5,
A5 = A6
WHERE (A3 IS NULL) AND (NOT A4 IS NULL)
UPDATE myTable SET
A2 = A3,
A3 = A4,
A4 = A5,
A5 = A6
WHERE (A2 IS NULL) AND (NOT A3 IS NULL)
UPDATE myTable SET
A1 = A2,
A2 = A3,
A3 = A4,
A4 = A5,
A5 = A6
WHERE (A1 IS NULL) AND (NOT A2 IS NULL)
最佳答案
鉴于 [anything] + NULL + [anything]
为 null 怎么样;
declare @t table(A1 int, A2 int, A3 int, A4 int, A5 int, A6 int)
insert @t values
(NULL, 2 , 3, 4, 5, 6),
(1, NULL, 3, 4, 5, 6),
(1, 2, NULL, 4, 5, 6),
(1, 2, 3, NULL, 5, 6),
(1, 2, 3, 4, NULL, 6),
(1, 2, 3, 4, 5, NULL),
(1, 2, 3, 4, 5, 6)
update @t
set A1 = coalesce(A1, A2),
A2 = case when A1 + A2 is null then A3 else A2 end,
A3 = case when A1 + A2 + A3 is null then A4 else A3 end,
A4 = case when A1 + A2 + A3 + A4 is null then A5 else A4 end,
A5 = case when A1 + A2 + A3 + A4 + A5 is null then A6 else A5 end,
A6 = case when A1 + A2 + A3 + A4 + A5 is null then null else A6 end
from @t
select * from @t
A1 A2 A3 A4 A5 A6
2 3 4 5 6 NULL
1 3 4 5 6 NULL
1 2 4 5 6 NULL
1 2 3 5 6 NULL
1 2 3 4 6 NULL
1 2 3 4 5 NULL
1 2 3 4 5 6
关于SQL UPDATE 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6461724/