使用一个SQL查询更新多行上的单个列

时间:2016-04-26 17:40:51

标签: sql

我需要更新数据库中一千多行的单个列。通常当我需要这样做时,我会做以下事情:

UPDATE [table] SET DATA="FOO" WHERE ID=23;
UPDATE [table] SET DATA="ASD" WHERE ID=47;
UPDATE [table] SET DATA="FGH" WHERE ID=83;
UPDATE [table] SET DATA="JKL" WHERE ID=88;
UPDATE [table] SET DATA="QWE" WHERE ID=92;
UPDATE [table] SET DATA="BAR" WHERE ID=97;

我觉得应该有办法轻松地做到这一点,但在网上搜索后,我找不到解决方案。

我所希望的是:

-- THIS DOES NOT WORK
UPDATE [table]
  SET DATA=("FOO", "ASD", "FGH", "JKL", "QWE", "BAR") 
  WHERE ID=(23, 47, 83, 88, 92, 9);

需要注意的一条重要信息是,我总是在一组特定的行中设置一列,相同的列。

有谁知道最好的方法吗?

5 个答案:

答案 0 :(得分:3)

我假设你在MySQL。您可以结合使用&#34; Field&#34;和&#34; Elt&#34;功能可以在单个查询中执行您需要的操作(在CASE WHEN THEN WHEN THEN WHEN THEN WHEN THEN WHEN THEN WHEN THEN WHEN THEN ENDIF(<condition>,<output>,if(<condition2>,<output2>, if()))方法旁边。

UPDATE [table] SET DATA=ELT(FIELD(ID,
   13, 14, 15, 16, 17, 18, 19),'FOO', 'ASD', 'FGH', 'JKL', 'QWE', 'BAR');

这与Oracle中的DECODE()函数类似,我希望在其他DBMS中有对应的函数。

答案 1 :(得分:2)

您可以使用MERGE标准中的SQL:2003语句,该语句自SQL Server 2008以来在Transact-SQL中可用:

MERGE mytable
USING (VALUES (23, 'FOD'),
              (47, 'ASD'),
              (83, 'FGH'),
              (88, 'JKL'),
              (92, 'QWE'),
              ( 9, 'BAR')) AS pairs(id2, data2)
     ON id = id2 
WHEN MATCHED 
     THEN UPDATE SET data = data2

USING子句允许使用table value constructor指定派生表(参见该页面上D点下的示例)。

或者,更常用的SQL:92 standard语法是:

UPDATE mytable
SET    data = 
       CASE id
            WHEN 23 THEN 'FOD'
            WHEN 47 THEN 'ASD'
            WHEN 83 THEN 'FGH'
            WHEN 88 THEN 'JKL'
            WHEN 92 THEN 'QWE'
            WHEN  9 THEN 'BAR'
       END
WHERE  id IN (23, 47, 83, 88, 92, 9);

明显的缺点是你最终指定id值两次。您可以不使用WHERE子句并在ELSE data构造中添加CASE,但实际上您将更新所有行,这样效率低且可能会产生不良副作用(通过触发器)

答案 2 :(得分:2)

您实际上可以使用插入...重复密钥更新

来执行此操作
{{1}}

答案 3 :(得分:1)

我能想到的一种方式就是加入......你试图更新的方式不会扩展

---每次要更新数据时,都会在下表中插入更新。

create table #test
(
data varchar(2),
id int
)

insert into #test
select 'abc',1
union  all
select 'cde',2

现在您更新主表如下

update mt
set mt.data=t.data
from maintable  mt
join
#test t
on t.id=mt.id

答案 4 :(得分:1)

Sql Server

UPDATE t1 
set DATA = derived1.NewValue
From
[table] t1 join
(
Select 'Foo' as NewValue, 23 as MyId 
union all Select 'ASD' as NewValue, 47 as MyId 
union all Select 'FGH' as NewValue, 83 as MyId 
) as derived1
on t1.ID = derived1.MyId