Ваши требования не ясны, и я постараюсь объяснить, почему.
Определим таблицу учеников
ID FirstName LastName
1 John Smith
2 Mike Smith
3 Ben Bray
4 John Bray
5 John Smith
6 Bill Lynch
7 Bill Smith
Запрос с предложением WHERE:
FirstName in ('Mike', 'Ben', 'Mike')
вернет только 2 строки, потому что это может быть переписано как:
FirstName='Mike' or FirstName='Ben' or FirstName='Mike'
WHERE - это фильтрующее предложение, которое просто говорит, удовлетворяет ли существующая строка заданным условиям или нет (для каждой из строк, созданных предложением FROM.
Допустим, у нас есть подзапрос, который возвращает любое количество не определенных имен FirstNames
В случае, если SQ содержит 'Mike', 'Ben', 'Mike', используя внутреннее соединение, вы можете получить эти 3 строки без проблем
Select ST.* from Students ST
Inner Join (Select name from …. <your subquery>) SQ
On ST.FirstName=SQ.name
Результат будет:
ID FirstName LastName
2 Mike Smith
2 Mike Smith
3 Ben Bray
Данные примечания не упорядочены по порядку имен, возвращаемых SQ. Если вы хотите это, SQ должен вернуть некоторый код заказа, например ::
Ord Name
1. Mike
2. Ben
3. Mike
В этом случае запрос должен быть:
Select ST.* from Students ST
Inner Join (Select ord, name from …. <your subquery>) SQ
On ST.FirstName=SQ.name
Order By SQ.ord
И результат:
ID FirstName LastName
2 Mike Smith (1)
3 Ben Bray (2)
2 Mike Smith (3)
Теперь давайте посмотрим, что произойдет, если подзапрос вернет
Ord Name
1. Mike
2. Bill
3. Mike
В итоге вы получите
ID FirstName LastName
2 Mike Smith (1)
6 Bill Lynch (2)
7 Bill Smith (2)
2 Mike Smith (3)
Еще хуже, если у вас есть что-то вроде:
Ord Name
1. John
2. Bill
3. John
Результат:
ID FirstName LastName
1 John Smith (1)
4 John Bray (1)
5 John Smith (1)
6 Bill Lynch (2)
7 Bill Smith (2)
1 John Smith (3)
4 John Bray (3)
5 John Smith (3)
Это сложная ситуация, и вы должны уточнить, что именно является требованием.
Если вам нужен только один студент с одинаковым именем, для каждой строки в SQ вы можете использовать что-то вроде SQL 2005 +):
;With st1 as
(
Select Row_Number() over (Partition by SQ.ord Order By ID) as rowNum,
ST.ID,
ST.FirstName,
ST.LastName,
SQ.ord
from Students ST
Inner Join (Select ord, name from …. <your subquery>) SQ
On ST.FirstName=SQ.name
)
Select ID, FirstName, LastName
From st1
Where rowNum=1 -- that was missing row, added later
Order By ord
Возвращается (для значений SQ Джон, Билл, Джон)
ID FirstName LastName
1 John Smith (1)
6 Bill Lynch (2)
1 John Smith (3)
Обратите внимание, что числа (1), (2), (3) отображаются для отображения значения ord, хотя они не возвращаются по запросу.