Вкладений оператор select у SQL Server


387

Чому наступне не працює?

SELECT name FROM (SELECT name FROM agentinformation)

Я думаю, що моє розуміння SQL неправильне, тому що я міг би подумати, що це поверне те саме, що і

SELECT name FROM agentinformation

Чи не створює внутрішній оператор select набір результатів, який зовнішній оператор SELECT запитує?

Відповіді:


672

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

SELECT name FROM (SELECT name FROM agentinformation) a  

або бути більш чітким

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

76
Переконайтесь, що ваш псевдонім теж дещо багатослівний! Я люблю, коли мені доводиться працювати на вири з t1, t2, t3, t4, t5, t6
Doug Chamberlain

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

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

"Правильно, я ідіот! Спасибі, прийму колись дозволено". Ні. Просто невіглас. Як і всі ми.
Lucio Mollinedo

2
Oracle приймає перше selectбез псевдоніму.
Kjetil S.

49

Відповідь надається Джо Стефанеллі вже правильно.

SELECT name FROM (SELECT name FROM agentinformation) as a  

Нам потрібно зробити псевдонім підзапиту, оскільки для запиту потрібен об’єкт таблиці, який ми отримаємо від створення псевдоніму для підзапиту. Концептуально результати підзапиту замінюються на зовнішній запит. Оскільки нам потрібен об’єкт таблиці у зовнішньому запиті, нам потрібно зробити псевдонім внутрішнього запиту.

Виписки, що включають підзапит, зазвичай мають одну з таких форм:

  • WHERE вираз [NOT] IN (підзапит)
  • WHERE вираз порівняння_оператор [БУДЬ | ВСЕ] (підзапит)
  • ДЕ [НЕ] ІСНУЄ (підзапит)

Перевірте, чи немає інших підзапитів та типів підзапитів .

Більше прикладів вкладених запитів.

  1. IN / NOT IN - Цей оператор приймає висновок внутрішнього запиту після того, як внутрішній запит буде виконаний, який може бути нульовим або більше значенням, і надсилає його до зовнішнього запиту. Потім зовнішній запит отримує всі відповідні рядки [оператор IN] або невідповідні [оператор NOT IN].

  2. ANY - [> ANY or ANY operator приймає список значень, створених внутрішнім запитом, і отримує всі значення, що перевищують мінімальне значення списку. The

наприклад> БУДЬ-ЯКОГО (100,200,300), будь-який оператор отримає всі значення, що перевищують 100.

  1. ALL - [> ALL або ALL оператор приймає список значень, створених внутрішнім запитом, і отримує всі значення, що перевищують максимум списку. The

наприклад> ALL (100,200,300), оператор ALL отримає всі значення більше 300.

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