我需要更新数据库中一千多行的单个列。通常当我需要这样做时,我会做以下事情:
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);
需要注意的一条重要信息是,我总是在一组特定的行中设置一列,相同的列。
有谁知道最好的方法吗?
答案 0 :(得分:3)
我假设你在MySQL。您可以结合使用" Field"和" Elt"功能可以在单个查询中执行您需要的操作(在CASE WHEN THEN WHEN THEN WHEN THEN WHEN THEN WHEN THEN WHEN THEN WHEN THEN END
或IF(<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