具有多个SET和WHERE的SQL语句

74

我想知道这是否是一个有效的查询:

UPDATE  table
SET ID = 111111259

WHERE ID = 2555

AND SET ID = 111111261

WHERE ID = 2724

AND SET ID = 111111263

WHERE ID = 2021

AND SET ID = 111111264

WHERE ID = 2017

有用的链接:https://bertwagner.com/posts/4-ways-to-define-lookup-values-in-a-query/ - George Birbilis
11个回答

88

不可以!

你需要逐个处理它们。

Update [table]
Set ID = 111111259
WHERE ID = 2555

Update [table]
Set ID = 111111261
WHERE ID = 2724

--...

82

最佳选择是多次更新。

另外一种方法如下,但不建议使用:

UPDATE table
SET ID = CASE WHEN ID = 2555 THEN 111111259 
              WHEN ID = 2724 THEN 111111261
              WHEN ID = 2021 THEN 111111263
              WHEN ID = 2017 THEN 111111264
         END
WHERE ID IN (2555,2724,2021,2017)

1
不错的一份 + 1。有时并不是最好的脚本会得到奖励。 - t-clausen.dk
18
如果我的脚本帮助某人解决了问题或学到了什么,那我已经得到了回报! - niktrs
5
为什么不建议这样做?能否请你解释一下?非常感谢! - Philipp Otto
5
为什么不推荐这样做? - Subliminal Hash
9
@PhilippOtto、Kemal Emal和未来的读者们。因为使用CASE语句比进行单独查询(就像被接受的答案所做的那样)更加耗费资源。 - KBell

35

不是有效的查询语句。 您只能有一个SET语句,其中包含多个字段,但也只能有一个WHERE子句。

update table1 set field1=value1, field2=value2, field3=value3 where filed4=value5

7
不,这是正确的做法:

不要这样做


UPDATE table SET ID = 111111259 WHERE ID = 2555

UPDATE table SET ID = 111111261 WHERE ID = 2724

UPDATE table SET ID = 111111263 WHERE ID = 2021

UPDATE table SET ID = 111111264 WHERE ID = 2017

5
您也可以像这样使用case then:
UPDATE  table
SET ID = case

when ID = 2555 then 111111259

when ID = 2724 then 111111261

when ID = 2021 then 111111263

when ID = 2017 then 111111264

else ID
end

4
不,您需要为每个更新创建一个单独的查询。

3

不可以。您需要进行单独的更新:

UPDATE  table
SET ID = 111111259
WHERE ID = 2555

UPDATE  table
SET ID = 111111261
WHERE ID = 2724

UPDATE  table
SET ID = 111111263
WHERE ID = 2021

UPDATE  table
SET ID = 111111264
WHERE ID = 2017

3

既然SQL可以执行你想要的所有行,我会像这样编写你的代码:

在你的SQL管理工具内执行查询,这应该可以正常工作。

UPDATE  table
SET ID = 111111259 WHERE ID = 2555    

UPDATE  table
SET ID = 111111261 WHERE ID = 2724

UPDATE  table
SET ID = 111111263 WHERE ID = 2021

UPDATE  table
SET ID = 111111264 WHERE ID = 2017

1

不,你需要分别处理每一条语句。

UPDATE table1
 Statement1;
 UPDATE table 1
 Statement2;

等等,依此类推


1
...正如2011年有人回答的那样 :/ - Stephen Kennedy
1
只是在做我的工作。 - pr0grammaniac

1

你可以这样做

WITH V(A,B) AS (VALUES 
     (2555,111111259)    
    ,(2724,111111261)     
    ,(2021,111111263)    
    ,(2017,111111264)    

    )
SELECT COUNT(*) FROM NEW TABLE (
    UPDATE table
    SET id =     (SELECT B FROM V WHERE ID = A)
    WHERE EXISTS (SELECT B FROM V WHERE ID = A)
) 

注意,该方法不适用于列式存储表。在这种情况下,请使用MERGE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接