2015-03-24 160 views
0
BEGIN TRANSACTION 

DELETE FROM MessagesRead 
WHERE [To] <> 'Feadmin' 
    AND [To] <> 'Catalonia' 
    AND [To] <> 'Bromordia' 
    AND [From] <> 'Feadmin' 
    AND [From] <> 'Catalonia' 
    AND [From] <> 'Bromordia' 
    AND MessageID IN (SELECT MessageID 
        FROM Messages 
        WHERE TickNr < ((SELECT TickNumber FROM CurrentTick)-1000)) 
    AND Saved = 0 AND [Read] =1; 

DELETE FROM Messages 
WHERE MessageID NOT IN (SELECT DISTINCT MessageID FROM MessagesRead); 

DELETE FROM MessagesAdmin 
WHERE MessageID NOT IN (SELECT DISTINCT MessageID FROM Messages); 

DELETE from DiscussionMessages 
WHERE DATEDIFF(DAY,Inserted,CURRENT_TIMESTAMP) > 6000 

COMMIT TRANSACTION 

我刚刚从SQL Server 2012升级到2014年我跑已经工作上面的存储过程到现在为止收到错误消息:SQL - 子查询返回多个值

消息512,级别16,状态1,过程Engine_DeleteMessages,第9行
子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

我明明已经制定了不应该说WHERE TickNr <但我想不出更好的方式来这个词,或者为什么它工作,直到我升级?

+0

它看起来像你的旧数据没有重复。 IN声明为您提供了返回大量记录的机会,大部分声明也是如此。也许添加一个Distinct到MessageID IN(SELECT ...)? – 2015-03-24 21:28:13

回答

0

你在CurrentTick中有多行吗?如果该表中只有一行,那么上面的查询就可以工作。难道现在在该表中现在有两行或更多行吗?

+0

是的,有不止一行...谢谢,道歉我从来没有想过要检查那张表,似乎当我从备份中恢复数据库时,它重复了几张表。我已经删除了该表中的重复项目,并且工作正常。谢谢。 – 2015-03-24 21:33:39

3

这是一个很不错的错误信息,很好解释。因此,您需要使用where子句或0​​来返回单个值/行的子查询。

或者:

SELECT TickNumber FROM CurrentTick WHERE id = <someID>; 

OR:

SELECT TOP 1 TickNumber FROM CurrentTick [ORDER BY some_col] 
0

如果你想确保TickNrCurrentTick比任何可能的TickNumber下,这可能是为ALL运营商一个很好的例子:

AND MessageID IN (SELECT MessageID 
        FROM Messages 
        WHERE TickNr < ALL((SELECT TickNumber FROM CurrentTick)-1000)) 

这将测试th e TickNr针对子查询中返回的所有值。

如果只能返回一行,则可以在子查询中使用top 1以确保子查询返回单个值。