2014-11-12 3 views
-5

Когда я запускаю запрос ниже, он показывает ошибку следующим образом: «Подзапрос SQL Server возвращает более 1 значения. Подзапрос следует =,! =, , < =, >,> = или когда вложенный запрос используется в качестве выражения»Подзапрос SQL Server возвратил более 1 значения. подзапрос следует =,! =, <, <= , >,> =

SELECT TOP(1) * 
FROM E_MASTER 
WHERE STATUSTYPE <> 'D' 
     AND EMPID = 'EMP459788' 
     AND DEPTNO IN (SELECT DEPTNO 
         FROM SERVICE_MASTER 
         WHERE EMPNAME = '......') 
     AND (DESG_CODE BETWEEN (SELECT S_DESG_CODE 
           FROM SERVICE_MASTER) AND (SELECT E_DESG_CODE 
                  FROM 
           SERVICE_MASTER)) 
+2

В догадке 'ВЫБРАТЬ E_DESG_CODE FROM SERVICE_MASTER' или' ВЫБРАТЬ S_DESG_CODE ОТ SERVICE_MASTER' возвращает более одного значения. – Fred

+0

Во-первых: сообщение об ошибке указывает, в чем проблема с вашим запросом. Прочтите и поймите! Во-вторых: SO не является отладочной службой! В противном случае: все субклеры, используемые в списке SELECT или как значение, участвующее в comparsion, должны возвращать одну (или ни одну) запись с ровно одним столбцом. – Pred

+0

Проверьте, возвращает ли SELECT S_DESG_CODE FROM SERVICE_MASTER' или 'SELECT E_DESG_CODE FROM SERVICE_MASTER' более чем одно значение. – Rohan

ответ

0

Давайте посмотрим ... наиболее вероятным culprint является„между“положение. Попытайтесь увидеть, что возвращаются подзапросы.

(SELECT S_DESG_CODE FROM SERVICE_MASTER) AND 
(SELECT E_DESG_CODE FROM SERVICE_MASTER) 

Вы можете изменить логику, чтобы допустить, что подзапросы вернуться более, что один ряд или сделать затем вернуться только один в зависимости от ваших требований.

Невозможно точно сказать, не зная, как ваша реляционная диаграмма. Но вы можете попытаться удалить это между предложением where и связать SERVICE_MASTER с самим собой, используя соединение.

SELECT S_DESG_CODE FROM SERVICE_MASTER sm0 
join SERVICE_MASTER sm1 on sm1.E_DESG_CODE <= sm0.DESG_CODE 
join SERVICE_MASTER sm2 on sm2.S_DESG_CODE >= sm0.DESG_CODE 

Если вы не можете использовать фильтры для каждой строки. (Обратите внимание, фактическая логика запроса эквивалентна snipet выше, и после написания его я не уверен, если это то, что вы действительно хотите)

SELECT S_DESG_CODE FROM SERVICE_MASTER 
where E_DESG_CODE <= DESG_CODE and S_DESG_CODE >= DESG_CODE 
+1

Это действительно комментарий, а не ответ. – Pred

+0

@Pred: Ну, непонятый вопрос :-) кажется «Что я делаю неправильно?» и ответ: «Подзапросы в вашем предложении BETWEEN не должны возвращать более одного значения. Измените это, чтобы они вернули только одну строку или изменили вашу логику, чтобы разрешить несколько проверок». На мой взгляд, это * ответ. –

+0

Сообщение * после * редактирование - это ответ, основные подсказки без объяснения - это просто комментарий (оригинальный пост), на мой взгляд – Pred

Смежные вопросы

 Смежные вопросы