Выберите значения из одной таблицы, где другая = значение? - PullRequest
2 голосов
/ 12 февраля 2012

Я пытаюсь запустить SQL-запрос (SQL Server), который будет искать список имен из подзапроса.

У меня есть, но я получаю ошибку "подзапрос возвратил более 1":

SELECT FirstName + ' ' + LastName AS Name
FROM Members
WHERE     
   (MemberGUID = (SELECT ClassDetails.Leader
                  FROM Members AS Members_1 
                  INNER JOIN MemberDetails ON Members_1.MemberGUID = MemberDetails.Member 
                  INNER JOIN ClassDetails ON ClassDetails.Class = Members_1.CurrentClass
                  WHERE      
                      (MemberDetails.JoiningDate >= '02/03/2012') 
                      AND (Members_1.FirstName = '*') 
                      OR (MemberDetails.JoiningDate >= '02/03/2012') 
                      AND (Members_1.LastName = '*') 
                      OR (MemberDetails.JoiningDate >= '02/03/2012') 
                      AND (MemberDetails.Email IS NULL) 
                      AND (MemberDetails.MobilePhone IS NULL) 
                      AND (MemberDetails.WorkPhone IS NULL) 
                      AND (MemberDetails.HomePhone IS NULL) 
                      AND (Members_1.CurrentClass <> 339) 
                      AND (Members_1.CurrentClass <> 696) 
                      AND (Members_1.CurrentClass <> 0)))

Мне нужно это, чтобы вернуть значения FirstName и LastName для каждого значения, возвращенного в подзапросе.(Подзапрос возвращает список GUID, которые должны быть введены в оператор WHERE MemberGUID)

Как это можно сделать?

Ответы [ 4 ]

2 голосов
/ 12 февраля 2012

Используйте in вместо =.

...
WHERE (MemberGUID in ( ... ))

Вы также можете просто сделать это объединением вместо использования подзапроса:

SELECT FirstName + ' ' + LastName AS Name
FROM Members m1
INNER JOIN Members AS Members_1 ON m1.MemberGUID = ClassDetails.Leader
...
1 голос
/ 12 февраля 2012

Добавьте DISTINCT в подзапрос.

SELECT FirstName + ' ' + LastName AS Name
FROM Members
WHERE MemberGUID IN 
       (SELECT DISTINCT ClassDetails.Leader
        FROM Members AS Members_1 INNER JOIN MemberDetails 
                  ON Members_1.MemberGUID = MemberDetails.Member 
             INNER JOIN ClassDetails 
                 ON ClassDetails.Class = Members_1.CurrentClass
        WHERE    (MemberDetails.JoiningDate >= '02/03/2012') 
                      AND (Members_1.FirstName = '*') 
                      OR (MemberDetails.JoiningDate >= '02/03/2012') 
                      AND (Members_1.LastName = '*') 
                      OR (MemberDetails.JoiningDate >= '02/03/2012') 
                      AND (MemberDetails.Email IS NULL) 
                      AND (MemberDetails.MobilePhone IS NULL) 
                      AND (MemberDetails.WorkPhone IS NULL) 
                      AND (MemberDetails.HomePhone IS NULL) 
                      AND (Members_1.CurrentClass <> 339) 
                      AND (Members_1.CurrentClass <> 696) 
                      AND (Members_1.CurrentClass <> 0)))
1 голос
/ 12 февраля 2012

Хорошее место для запоминания существования ANY, SOME и ALL:

WHERE MemberGUID = ANY ( ... )
1 голос
/ 12 февраля 2012

Не так, я думаю, вы могли бы просто изменить MemberGUID = на MemberGUID IN.

Как говорится в сообщении об ошибке, ваш подзапрос возвращает много строк, и вы не можете сравнить одно значение с набором из множества строк. Но вы можете искать это значение в этих строках, что и делает оператор IN.

Ссылка MSDN

...