これはSQL標準のルールです(SQLのユーザーがおそらく考えていない詳細がたくさん含まれているため、かなり複雑です)。
ルールの背後には2つの原則があります。 1つ目は、論理的に必要な場合(having
)を除いて、標準では操作の順序が強制されないことです。 たとえば、句はgroup by
の後に論理的に処理する必要があります )。これは、SQLが記述的であるという概念の基礎です。 結果が説明されている言語。特定のデータベースエンジンは、独自の実行パスを決定できます。
2番目の原則は、あいまいさを回避することです。ここで、SQLコンパイラがいつ知っているかを定義するスコープルールが登場します。
次のステートメントを検討してください。
select a as b, b as a, a + 1 as d
-----------------------^
from t
問題は、どのa
a+1
を実行します 列a
を参照してください 表または列b
(これはa
としてエイリアスされます )select
。規格によれば、これは明白です。 select
では列のエイリアスが不明です それらが定義されている句。
これはwhere
にまで及びます 同じスコープで評価される句も同様です。同じ例を考えてみましょう:
select a as b, b as a, a + 1 as d
from t
where a > 100
どのa
where
状態は?標準は明確です。 where
句はselect
の列エイリアスを理解しません 。これは、select
where
の後に(論理的に)評価されます 。だから、あなたが言うとき:
select row_number() over (order by a) as seqnum
from t
where a > 100
返される値は、最初のa
から始まります 後 100.列挙は最初には行われず、フィルター処理された行はフィルター処理されたシーケンス番号を取得します。