我正在尝试根据另一个表上的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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
达到我需要的正确方法是什么?
非常感谢
答案 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;