【问题标题】:2 SQL Updates in 1 statement1 个语句中的 2 个 SQL 更新
【发布时间】:2012-03-31 22:27:08
【问题描述】:

我正在尝试执行以下操作:

UPDATE table SET fieldA='valueA' WHERE id='id1', SET fieldB='valueB' WHERE id='id2';

但似乎无法让它工作。有没有办法做到这一点,还是我需要使用两个单独的 SQL 命令?

【问题讨论】:

  • 虽然可以确定可以编写一些复杂的 SQL 来执行您想要的操作,但出于多种原因,最好只使用 2 个更新语句。首先是您希望能够阅读自己的代码而不会头疼!

标签: sql sql-update


【解决方案1】:

如果你真的需要在一个语句中做到这一点,你可以使用这个:

UPDATE table 
    SET fieldA = case when id = 'id1' then 'valueA' else fieldA end, 
        fieldB = case when id = 'id2' then 'valueB' else fieldB end
WHERE id in ('id1', 'id2');

但为了清楚起见(以及因此可维护性),使用两个语句会更好。

【讨论】:

  • 非常感谢您回答我的问题!我正在尝试减少代码中的 SQL 调用次数以提高速度,我愿意牺牲一点清晰度来实现这一点!
【解决方案2】:

最好使用 2 个不同的 UPDATE 语句来完成,因为您有 2 个不同的 WHERE 子句:

UPDATE table SET fieldA='valueA' WHERE id='id1'
UPDATE table SET fieldB='valueB' WHERE id='id2'

【讨论】:

  • 它没有。如果有合适的索引,更好作为两个更新来完成,但如果它真的,它可以作为单个语句完成必要的(如果没有适当的索引,则产生一次扫描)。
【解决方案3】:
MERGE INTO YourTable
   USING ( VALUES ( 'id1', 'valueA', NULL ), 
                  ( 'id2', NULL, 'valueB' ) )              
      AS source ( id, fieldA , fieldB )
         ON YourTable.id = source.id
WHEN MATCHED THEN
   UPDATE 
      SET fieldA = COALESCE(source.fieldA, YourTable.fieldA), 
          fieldB = COALESCE(source.fieldB, YourTable.fieldB);

【讨论】:

    【解决方案4】:

    您需要使用 2 个单独的 SQL 语句,因为 set 运算符适用于由 where 子句过滤的整个结果集。

    UPDATE table SET fieldA='valueA' WHERE id='id1'; UPDATE table SET fieldB='valueB' WHERE id='id2';
    

    【讨论】:

      【解决方案5】:
      UPDATE table SET fieldA='valueA',fieldB='valueB' WHERE id in ('id1','id2')
      

      【讨论】:

      • 这将更新两个 ID 的两个字段。 OP 希望为每个 ID 更新不同的字段。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      相关资源
      最近更新 更多