2011-05-13 90 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)。