Jest to reguła ze standardu SQL (która jest dość skomplikowana, ponieważ zawiera wiele szczegółów, o których użytkownicy SQL prawdopodobnie nie myślą).
Za tą zasadą stoją dwie zasady. Po pierwsze, standard nie narzuca kolejności operacji, chyba że jest to logicznie konieczne (having
na przykład klauzula musi być logicznie przetworzona po group by
). To jest podstawa pojęcia, że SQL jest opisowy język, w którym opisane są wyniki. Każdy konkretny silnik bazy danych może określić własne ścieżki wykonania.
Drugą zasadą jest unikanie niejasności. W tym miejscu pojawiają się reguły określania zakresu, które określają, co kompilator SQL wie kiedy.
Rozważ następujące stwierdzenie:
select a as b, b as a, a + 1 as d
-----------------------^
from t
Pytanie brzmi:który a
robi a+1
patrz kolumna a
w tabeli lub kolumnie b
(który jest aliasem a
) w select
. Zgodnie ze standardem jest to jednoznaczne. Aliasy kolumn nie są znane w select
klauzula, w której są zdefiniowane.
To rozciąga się na where
również klauzula, która jest oceniana w tym samym zakresie. Rozważ ten sam przykład:
select a as b, b as a, a + 1 as d
from t
where a > 100
Który a
robi where
warunek odnoszą się do? Standard jest jednoznaczny. where
klauzula nie rozumie aliasów kolumn w select
. Dzieje się tak, ponieważ select
jest (logicznie) oceniany po where
. Tak więc, kiedy mówisz:
select row_number() over (order by a) as seqnum
from t
where a > 100
Zwracana wartość zaczyna się od pierwszego a
po 100. Wyliczenie nie odbywa się najpierw, a filtrowane wiersze otrzymują numery sekwencyjne, które są odfiltrowywane.