Je to pravidlo ze standardu SQL (které je poměrně komplikované, protože jde do mnoha detailů, o kterých uživatelé SQL pravděpodobně nepřemýšlejí).
Za pravidlem stojí dva principy. První je, že standard neukládá pořadí operací, kromě případů, kdy je to logicky nutné (having
klauzule, například, musí být logicky zpracována po group by
). To je základ toho, že SQL je popisný jazyk, kde jsou popsány výsledky. Každý konkrétní databázový stroj může určit své vlastní cesty provádění.
Druhou zásadou je vyhnout se nejednoznačnosti. Zde nastupují pravidla pro stanovení rozsahu, která definují, co kdy kompilátor SQL ví.
Zvažte následující tvrzení:
select a as b, b as a, a + 1 as d
-----------------------^
from t
Otázka zní:který a
dělá a+1
viz sloupec a
v tabulce nebo sloupci b
(který má alias jako a
) v select
. Podle normy je to jednoznačné. Aliasy sloupců nejsou v select
známy klauzule, kde jsou definovány.
To se vztahuje na where
doložka, která je hodnocena ve stejném rozsahu. Zvažte stejný příklad:
select a as b, b as a, a + 1 as d
from t
where a > 100
Které a
dělá where
stav odkazovat? Norma je jednoznačná. where
klauzule nerozumí aliasům sloupců v select
. Je to proto, že select
je (logicky) vyhodnocen za where
. Takže, když říkáte:
select row_number() over (order by a) as seqnum
from t
where a > 100
Vrácená hodnota začíná prvním a
po 100. Výčet neproběhne jako první, filtrované řádky získají pořadová čísla, která jsou odfiltrována.