É a regra do padrão SQL (que é bastante complicada porque entra em muitos detalhes que os usuários do SQL provavelmente não pensam).
Existem dois princípios por trás da regra. A primeira é que o padrão não impõe uma ordenação de operações, exceto quando logicamente necessário (um
having
cláusula, por exemplo, deve ser processada logicamente após um group by
). Esta é a base da noção em SQL é um descritivo linguagem, onde os resultados são descritos. Qualquer mecanismo de banco de dados específico pode determinar seus próprios caminhos de execução. O segundo princípio é evitar a ambiguidade. É aqui que entram as regras de escopo, que definem o que um compilador SQL sabe quando.
Considere a seguinte afirmação:
select a as b, b as a, a + 1 as d
-----------------------^
from t
A questão é:qual
a
faz a+1
consulte, a coluna a
na tabela ou na coluna b
(que é alias como a
) em select
. De acordo com o padrão, isso é inequívoco. Os aliases de coluna não são conhecidos no select
cláusula onde eles são definidos. Isso se estende ao
where
cláusula também, que é avaliada no mesmo escopo. Considere o mesmo exemplo:select a as b, b as a, a + 1 as d
from t
where a > 100
Qual
a
faz o where
condição se refere? O padrão é inequívoco. O where
cláusula não entende aliases de coluna no select
. Isso ocorre porque o select
é (logicamente) avaliado após o where
. Então, quando você diz:select row_number() over (order by a) as seqnum
from t
where a > 100
O valor retornado começa com o primeiro
a
depois 100. A enumeração não ocorre primeiro, com as linhas filtradas obtendo números de sequência que são filtrados.