2012-02-12 2 views
2

Я пытаюсь запустить SQL-запрос (SQL Server), который будет искать список имен из подзапроса.Выберите значения из одной таблицы, где another = value?

У меня есть это, но я получаю «подзапрос возвращает более чем на 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)

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

ответ

1

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

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

MSDN Reference

+0

Указывает на то, что вы наделили Guffa на несколько секунд;) Спасибо большое! - Можно ли указать число вхождений рядом с именем? то есть «Myles Grey» Как некоторые GUID появляются несколько раз, и число важно? –

+1

Возможно, но не без рефакторинга с вашей стороны. Вкратце, я думаю, что проще всего было бы создать CTE или временную таблицу, содержащую GUID и их количество. (будет что-то вроде 'SELECT Id, Count (Id) FROM ... WHERE ... GROUP By Id') Затем присоедините' Member' к этому, выбирая имена из 'Member' и count из вашей таблицы CTE/Temp. –

+0

@MylesGray: Вы должны выбрать лучший ответ, не обязательно первый ответ. Кроме того, если вы проверяете время, мой ответ был первым ... – Guffa

2

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

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

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

SELECT FirstName + ' ' + LastName AS Name 
FROM Members m1 
INNER JOIN Members AS Members_1 ON m1.MemberGUID = ClassDetails.Leader 
... 
1

Хорошее место, чтобы помнить о существовании ANY, SOME и ALL:

WHERE MemberGUID = ANY (...) 
1

Добавить 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)))