SQL UPDATE 性能不佳

标签 sql sql-server t-sql

我的数据库表有以下列: 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/

相关文章:

mysql工作台错误代码1215 : can't add foreign key constraint

asp.net - 如何在vb.net中显示数据库中的数据

python - 如何使用 Django ORM 在约会表中查找可用时间段?

sql-server - ORDER BY中的字段影响窗口函数的结果

sql - SQL Server 中的 SUBQUERY 和 EXISTS

sql-server - 标签索引

mysql - 检查用户和另一个用户是否互相喜欢并获取喜欢的用户的信息

sql-server - 插入行总和并将其显示在同一个表中

sql server 如果不存在则插入并获取插入的id到另一个表中

sql-server - 有效的 SQL Server 触发器 - 仅触发一次