使用子查询更新多行

时间:2011-05-13 03:29:39

标签: sql sql-update

我有两个表,UserStatus和User。

UserStatus有两个字段: 用户名,状态

用户有两个字段 用户名,已删除

这是我正在使用的查询

Update users
   set deleted = '1'
where username = (select username
                    from tempDUDPIVOT 
                   where status = 'inactive')

但得到错误:

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

我尝试了很多变化,但无法弄清楚解决方案......我感觉非常明显。

感谢您的帮助。

感谢。

2 个答案:

答案 0 :(得分:3)

Update users set deleted = '1'
where username IN (select username from tempDUDPIVOT where status = 'inactive')

IN接受要返回的0..inf值,=接受1而且只接受1(不是0或42)。

答案 1 :(得分:2)

UPDATE语法需要标量子查询。使用EXISTS (subquery)使谓词的参数更接近(即使查询更容易阅读和维护,IMO),例如

UPDATE users 
   SET deleted = '1' 
 WHERE EXISTS (
               SELECT *
                 FROM tempDUDPIVOT AS T1
                WHERE T1.status = 'inactive'
                      AND T1.username = users.username
              );

如果您的SQL产品支持它,您也可以使用标准SQL MERGE(尽管请注意谓词的参数在这里更远):

MERGE INTO users 
   USING (
          SELECT username
            FROM tempDUDPIVOT
           WHERE status = 'inactive'
         ) AS T1 (username)
      ON T1.username = users.username
WHEN MATCHED THEN 
   UPDATE
      SET users.deleted = '1';