2011-05-13 56 views
1

我有两个表UserStatus和User。用子查询更新多行

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

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

这是查询我使用

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

,但得到的错误:

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

我已经尝试了一些变化,但无法找出解决方案......我有一种感觉,它非常明显。

您的帮助表示赞赏。

谢谢。

回答

2

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

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

你也可以使用标准的SQL MERGE如果你的SQL产品支持它(但注意谓语的参数更远这里):

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'; 
+0

感谢您的帮助。它在SQL2005上,所以我没有合并可用。 – Stan

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

IN接受要返回0..inf值,并=接受1且仅一个(不是0或42)。