2011-09-01 28 views
0

我想基於另一個表上的select語句更新一個表中的多個行。基於select語句的MSSQL更新多行

這是我的查詢:

UPDATE dbo.[user_message_content] 
SET [status] = 1 
WHERE [message_id] = (SELECT [message_id] FROM dbo.[user_message] WHERE [receiver_id] = @userID) 
AND [status] = 0 

這個SELECT語句可能返回多行,這使我這個錯誤:

消息512,級別16,狀態1,過程usp_profileUserMessageMarkAsRead,11號線 子查詢返回了多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

什麼是實現我所需要的正確方法?

非常感謝

回答

4

UPDATE dbo.[user_message_content] 
SET [status] = 1 
WHERE [message_id] IN 
    (SELECT [message_id] FROM dbo.[user_message] WHERE [receiver_id] = @userID) 
AND [status] = 0 
0

我認爲你需要使用如果要更新所有這些記錄,改變=IN聯接做到這一點

USE dbo; // Sets the current database to dbo, I did this for readability 

UPDATE user_message_content join user_message on user_message_content.message_id = user_message.message_id 
SET user_message_content.status = 1 
WHERE user_message.receiver_id = @userID; 
1

您也可以使用UPDATE和FROM子句http://msdn.microsoft.com/en-us/library/aa260662(SQL.80).aspx

USE tempdb; 
    GO 

    create table #user_message_content([status] int, message_id int) 
    create table #user_message (message_id int,receiver_id int) 

    declare @UserID int 

    UPDATE mc 
    SET mc.[status] = 1 
    FROM #user_message_content mc join #user_message m on mc.message_id = m.message_id 
    WHERE m.receiver_id = @userID 
      AND mc.[status]=0; 

    drop table #user_message_content 
    drop table #user_message