2015-03-24 149 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以確保子查詢返回單個值。