Вложенный оператор выбора в SQL Server


389

Почему не работает следующее?

SELECT name FROM (SELECT name FROM agentinformation)

Я думаю, что мое понимание SQL неверно, потому что я думал, что это вернет то же самое, что и

SELECT name FROM agentinformation

Разве внутренний оператор выбора не создает результирующий набор, который затем запрашивает внешний оператор SELECT?

Ответы:


674

Вам необходимо создать псевдоним подзапроса.

SELECT name FROM (SELECT name FROM agentinformation) a  

или быть более явным

SELECT a.name FROM (SELECT name FROM agentinformation) a  

76
Убедитесь, что ваш псевдоним тоже многословен! Мне нравится, когда я начинаю работать над wuery с t1, t2, t3, t4, t5, t6
Даг Чемберлен

2
Куда пойдет whereпредложение для внешнего запроса?
Полковник Паник

3
@ColonelPanic: предложение WHERE для внешнего запроса будет добавлено в самом конце.
Джо Стефанелли

«Правильно, я идиот! Спасибо, приму, как только позволят». Неа. Просто невежественен. Как и все мы.
Лусио Моллинедо

2
Oracle принимает первый selectбез псевдонима.
Кжетил С.

49

Ответ предоставляется Джо Стефанелли уже правильно.

SELECT name FROM (SELECT name FROM agentinformation) as a  

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

Утверждения, которые включают подзапрос, обычно принимают одну из следующих форм:

  • ГДЕ выражение [НЕ] В (подзапрос)
  • ГДЕ выражение сравнения_оператор [ЛЮБОЙ | ALL] (подзапрос)
  • ГДЕ [НЕ] СУЩЕСТВУЕТ (подзапрос)

Проверьте более правил подзапросов и типов подзапросов .

Дополнительные примеры вложенных подзапросов.

  1. IN / NOT IN - этот оператор берет выходные данные внутреннего запроса после выполнения внутреннего запроса, который может иметь ноль или более значений, и отправляет его во внешний запрос. Затем внешний запрос извлекает все соответствующие строки [оператор IN] или несовпадающие строки [оператор NOT IN].

  2. ЛЮБОЙ - [> ЛЮБОЙ или ЛЮБОЙ оператор берет список значений, созданных внутренним запросом, и извлекает все значения, которые превышают минимальное значение списка.

Например,> ЛЮБОЙ (100, 200, 300), оператор ЛЮБЫЙ извлечет все значения больше 100.

  1. ALL - [> Оператор ALL или ALL берет список значений, созданный внутренним запросом, и извлекает все значения, которые больше максимума списка.

Например,> ALL (100,200,300), оператор ALL извлечет все значения, превышающие 300.

  1. EXISTS - Ключевое слово EXISTS создает логическое значение [TRUE / FALSE]. Это EXISTS проверяет существование строк, возвращаемых подзапросом.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.