У меня есть SQL-запрос, псевдонимы которого совпадают с псевдонимами некоторых его подзапросов.
Например:
select *
from ROOM r
where ...
(
select *
from ROAD r
where ...
)
Это прекрасно работает, так как псевдоним подзапроса, кажется, скрывает основной.
- Будет ли это работать так во всех случаях?
- Получу ли я когда-нибудь неопределенные результаты?
- Если это нормально, как я могу сделать ссылку на основной запрос
r
?
sql-server
t-sql
subquery
alias
IcySnow
источник
источник
Ответы:
Для вложенных подзапросов нормально использовать те же псевдонимы, что и в родительском запросе, хотя это может немного смущать читателя кода. Пространство имен для псевдонимов во вложенном подзапросе отделено от пространства имен в родительском. Например, приведенный ниже запрос имеет вложенный подзапрос, в
b
котором также используется псевдонимb
. Это могло бы сбить с толку программиста, но хорошо с механизмом СУБД:В коррелированном подзапросе у вас есть доступ к псевдонимам родителя, поэтому псевдонимы должны быть уникальными для родительского запроса и коррелированного подзапроса. Если мы возьмем коррелированный подзапрос, такой как приведенный ниже, у нас будет одно глобальное пространство имен, совместно используемое между родительским запросом и коррелированным подзапросом:
Коррелированный подзапрос не имеет псевдонима, так как он не участвует в объединении как таковом 1 . Ссылки
b
иb2
forbar
доступны для подзапроса, так как коррелированные подзапросы совместно используют свое пространство имен для псевдонимов с родителем.1 Обратите внимание, что оптимизатор может выбрать использование операторов соединения в плане за кулисами, хотя указанная фактическая операция является коррелированным подзапросом, а не объединением с вложенным подзапросом.
источник
SELECT * FROM ( SELECT c FROM T ) AS T2;
- нет соединений, нет корреляции, но стандарт SQL требует, чтобы производной таблице была присвоена переменная диапазона (T2
в данном случае).В ConcernedOfTunbridgeWells вы пишете (выделено мое): «В коррелированном подзапросе у вас есть доступ к псевдонимам родителя, поэтому псевдонимы должны быть уникальными для родительского запроса и коррелированного подзапроса».
Я не верю, что уникальность необходима. Я считаю, что если псевдоним используется в коррелированном подзапросе в качестве имени корреляции, а также псевдоним таблицы во внешнем запросе, псевдоним в подзапросе будет иметь приоритет.
Пример:
Выходные данные равны «3»: таблицы T и U имеют общие 2 и 3, но
WHERE
предикат дополнительно фильтрует строки, возвращенные в 3, а 2 не существует в V.источник