Det är regeln från SQL-standarden (som är ganska komplicerad eftersom den går in på massor av detaljer som användare av SQL förmodligen inte tänker på).
Det finns två principer bakom regeln. Den första är att standarden inte ålägger en ordning av operationer, förutom när det är logiskt nödvändigt (en ha
sats, till exempel, måste logiskt bearbetas efter en grupp efter
). Detta är grunden för uppfattningen att SQL är en beskrivande språk, där resultaten beskrivs. Vilken speciell databasmotor som helst kan bestämma sina egna exekveringsvägar.
Den andra principen är att undvika oklarheter. Det är här scoping-reglerna kommer in, som definierar vad en SQL-kompilator vet när.
Tänk på följande påstående:
select a as b, b as a, a + 1 as d
-----------------------^
from t
Frågan är:vilken a
gör a+1
se kolumnen a
i tabellen eller kolumnen b
(som är alias som a
) i select
. Enligt standarden är detta entydigt. Kolumnalias är inte kända i select
klausul där de definieras.
Detta sträcker sig till where
klausulen, som utvärderas i samma omfattning. Tänk på samma exempel:
select a as b, b as a, a + 1 as d
from t
where a > 100
Vilken a
gör var
tillstånd hänvisar till? Standarden är entydig. select
. Detta beror på att välj
utvärderas (logiskt) efter var
. Så när du säger:
select row_number() over (order by a) as seqnum
from t
where a > 100
Det returnerade värdet börjar med det första a
efter 100. Uppräkningen sker inte först, med filtrerade rader som får sekvensnummer som filtreras bort.