2013-07-09 3 views
2
DELETE dbo.bBoxDetail 
FROM dbo.bBoxDetail AS BD 
INNER JOIN dbo.bBoxHeader AS BH ON LTRIM(RTRIM(BD.bBoxDetailId)) = LTRIM(RTRIM(BH.bBoxId)) 
WHERE LTRIM(RTRIM(BD.ESNs)) = (SELECT LTRIM(RTRIM(IMEI)) FROM dbo.tmpIMEI) 

Я получаю эту ошибку:Попытки удалить из Присоединяйтесь и я знаю, что у меня есть обалденное расстояние, и я знаю, что есть DUP IMEI-х

Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

BD.ESNs является NVARCHAR(50) и IMEI является NVARCHAR(30) у меня есть дубликат ESNs и я хотите удалить все ESNs, которые соответствуют SELECT ... IMEI

+0

Для форматирования кода вы можете выделить блок и использовать '{}' с панели инструментов редактирования. – Taryn

+0

См. Также [Как мне форматировать мои кодовые блоки?] (Http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks) –

ответ

0

Если вы читали ошибку

Msg 512, Level 16, State 1, Line 1 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Обратите внимание на подзапрос возвращает более чем на 1 значение, как это ошибка, вы возвращающее любое количество строк из вашего подзапроса:

Корр. ect SQL ниже:

DELETE dbo.bBoxDetail 
FROM dbo.bBoxDetail AS BD 
INNER JOIN dbo.bBoxHeader AS BH ON LTRIM(RTRIM(BD.bBoxDetailId)) = LTRIM(RTRIM(BH.bBoxId)) 
WHERE LTRIM(RTRIM(BD.ESNs)) = (SELECT TOP 1 LTRIM(RTRIM(IMEI)) FROM dbo.tmpIMEI) 
0

Использование IN оператора в ИНЕКЕ

DELETE dbo.bBoxDetail 
FROM dbo.bBoxDetail AS BD INNER JOIN dbo.bBoxHeader AS BH ON LTRIM(RTRIM(BD.bBoxDetailId)) = LTRIM(RTRIM(BH.bBoxId)) 
WHERE LTRIM(RTRIM(BD.ESNs)) IN (SELECT LTRIM(RTRIM(IMEI)) FROM dbo.tmpIMEI) 

но предпочтительный вариант является EXISTS оператора

DELETE dbo.bBoxDetail 
FROM dbo.bBoxDetail AS BD INNER JOIN dbo.bBoxHeader AS BH ON LTRIM(RTRIM(BD.bBoxDetailId)) = LTRIM(RTRIM(BH.bBoxId)) 
WHERE EXISTS (
       SELECT 1 
       FROM dbo.tmpIMEI 
       WHERE LTRIM(RTRIM(BD.ESNs)) = LTRIM(RTRIM(IMEI)) 
      ) 
+0

Оба эти запроса кажутся удалите одну строку. tmpIMEI имеет 500+, но я не могу получить больше одного удара, если я конвертирую это в select. – TooMuchToLearn