Давайте посмотрим на первый запрос.
SELECT ID
FROM MyTable AS t
WHERE Value = (SELECT MAX(Value) FROM t)
Это попытается выбрать из таблицы псевдоним t
.
Что не разрешено Следует выбрать из таблицы или представления.
Например:
SELECT ID
FROM MyTable AS t
WHERE Value = (SELECT MAX(Value) FROM MyTable)
Обратите внимание, что это не связано с областью действия.
Это также не разрешается без использования каких-либо подзапросов.
Например, это не получится по той же причине
SELECT t1.*, t2.*
FROM MyTable AS t1
JOIN t1 AS t2 ON t2.id = t1.id
Тогда у нас второй запрос.
SELECT ID, Value,
(
SELECT COUNT(Value)
FROM MyTable t1sub
WHERE t1sub.Value >= t1out.Value
) AS Rank
FROM MyTable AS t1out
Это называется коррелированным подзапросом.
Этот подзапрос связывает текущий t1out.Value
внешнего запроса с таблицей в подзапросе через t1sub.Value.
Повторно выполняет подзапрос для каждой строки из внешнего запроса.
О сфере применения.
Речь идет о том, что часть SQL может смотреть и использовать.
В предыдущем SQL псевдоним t1sub
известен только в рамках коррелированного подзапроса.
Внешний запрос даже не знает о псевдониме t1sub
, который используется в подзапросе.
Находясь внутри коррелированного подзапроса, можно увидеть и использовать t1out.Value
.
Некоторые тесты можно найти на db <> fiddle здесь