MSSQL根据select语句更新多行

时间:2011-09-01 07:09:01

标签: sql-server

我正在尝试根据另一个表上的select语句更新一个表中的多个行。

这是我的疑问:

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语句可能会返回多行,这会导致我出现此错误:

Msg 512,Level 16,State 1,Procedure usp_profileUserMessageMarkAsRead,Line 11 子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

达到我需要的正确方法是什么?

非常感谢

3 个答案:

答案 0 :(得分:5)

如果您要更新所有这些记录,请将=更改为IN

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

答案 1 :(得分: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

答案 2 :(得分:0)

我认为您需要使用联接来执行此操作

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;