【问题标题】:Update table based on multiple conditions without using CASE不使用 CASE 基于多个条件更新表
【发布时间】:2020-03-15 16:34:03
【问题描述】:

我需要根据多个条件更新一个表,并且更新需要在一个更新语句中完成。此外,限制是由于性能问题,我不能使用以下构造,因为我的更新中有大约 18 个 CASE 表达式:

UPDATE A
SET A.col1 = CASE WHEN B.col = someValue      THEN B.Col2 END,
    B.Col2 = CASE WHEN b.col = someOtherValue THEN B.Col2 END,
    .
    .
    --18th CASE stmt
    B.Col18 = CASE WHEN b.col = YetAnotherValue THEN B.Col2 END
FROM
    tableA A 
INNER JOIN
    tableB B ON A.someColumn = B.someColumn

任何建议将不胜感激。

【问题讨论】:

  • 更新语句有不同的辩证法,具体取决于 DBMS。因此,请同时标记您的 DBMS。
  • CASE expressions (不是语句!)更新中的性能问题应该不大。你有tablea.somecolumntableb.somecolumn 的索引吗?
  • T-SQL (MSFT SQL Server)
  • 为什么感觉会有性能问题,18个case表达式?。
  • @brand_new_developer 它是一个单一的更新声明,所以它应该无关紧要。如果你在一个循环中这样做,我会重新考虑写这个。尝试对性能进行基准测试,您打算使用此更新更新数百万或记录

标签: sql sql-server sql-update


【解决方案1】:

我怀疑您实际上想在更新之前聚合

UPDATE A
    SET A.col1 = B.col1,
        B.Col2 = B.col2,
          . . .
    FROM tableA A JOIN
         (SELECT B.someColumn,
                 MAX(CASE WHEN B.col = someValue THEN B.Col2 END) as col1,
                 MAX(CASE WHEN b.col = someOtherValue THEN B.Col2 END) as col2,
                 . . .
          FROM tableB B
          GROUP BY B.someColumn
         ) B
         ON A.someColumn = B.someColumn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多