На вложенный запрос распространяются следующие ограничения:
Список выбора вложенного запроса, начинающийся с оператора сравнения, может включать только одно выражение или имя столбца (за исключением операторов EXISTS и IN в инструкции SELECT * или в списке соответственно).
Если предложение WHERE внешнего запроса включает имя столбца, оно должно быть совместимо для соединения со столбцом в списке выбора вложенного запроса.
Типы данных ntext, text и image нельзя использовать в списке подзапросов выбора.
Так как они должны возвращать одно значение, вложенные запросы, введенные оператором неизмененных сравнений (за которым не следует ключевое слово ANY или ALL), не могут включать GROUP BY предложения и HAVING .
Ключевое DISTINCT слово нельзя использовать со вложенными запросами, включающими GROUP BY.
Нельзя COMPUTE указать предложения и INTO .
Предложение ORDER BY может быть указано только вместе с предложением TOP.
Представление, созданное с помощью вложенного запроса, не может быть обновлено.
Список выбора вложенного запроса, начинающегося с предложения EXISTS, по соглашению содержит звездочку (*) вместо отдельного имени столбца. Правила для вложенного запроса, начинающегося с предложения EXISTS, являются такими же, как для стандартного списка выбора, поскольку вложенный запрос, начинающийся с предложения EXISTS, проводит проверку на существование и возвращает TRUE или FALSE вместо данных.
В следующем примере столбец BusinessEntityID в предложении WHERE внешнего запроса неявно уточняется именем таблицы, используемой в предложении FROM внешнего запроса (Sales.Store). Ссылка на столбец CustomerID в списке выборки вложенного запроса уточняется именем таблицы с помощью предложения FROM вложенного запроса, то есть Sales.Customer.
SQLКопировать
USE AdventureWorks2016;
GO
SELECT [Name]
FROM Sales.Store
WHERE BusinessEntityID NOT IN
(SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID = 5);
GO
Общее правило состоит в том, что имена столбцов в инструкции неявно уточняются именем таблицы, указанной в предложении FROM того же уровня вложенности. Если столбец не существует в таблице, на которую ссылается FROM предложение вложенного запроса, он неявно квалифицируется таблицей, на которую ссылается FROM предложение внешнего запроса.
Вот как выглядит запрос с указанными неявными допущениями:
SQLКопировать
USE AdventureWorks2016;
GO
SELECT [Name]
FROM Sales.Store
WHERE Sales.Store.BusinessEntityID NOT IN
(SELECT Sales.Customer.CustomerID
FROM Sales.Customer
WHERE TerritoryID = 5);
GO
Никогда не неправильно указывать имя таблицы явным образом, и всегда можно переопределить неявные предположения об именах таблиц с явной квалификацией.
Важно!
Если столбец, на который есть ссылка во вложенном запросе, не существует в таблице, указанной в предложении FROM вложенного запроса, но существует в таблице, на которую ссылается предложение FROM внешнего запроса, запрос будет выполнен без ошибок. SQL Server неявно квалифифициирует столбец во вложенном запросе с именем таблицы во внешнем запросе.
Do'stlaringiz bilan baham: |