33709


以下のWebページによると、ON句がJOIN句よりも先に評価されるそうです。  
[SELECT (Transact-SQL)](https://technet.microsoft.com/ja-
jp/library/ms189499\(v=sql.110\).aspx) <https://technet.microsoft.com/ja-
jp/library/ms189499(v=sql.110).aspx>  
しかし、JOIN句に別名を付したときその別名はON句でも使用できます。  
例: `select * from data d inner join mst m on m.num=d.num`  
評価順序の関係でSELECT句に付した別名がWHERE句で使用できないことに対応するのであれば、JOIN句→ON句の順に評価されているのではないでしょうか。


CC BY-SA 3.0
2017-04-02T04:23:37.180
33708
2017-04-02T09:39:53.213
19705
question
sql sql-server
ON句がJOIN句よりも先に評価されるのは本当ですか？


論理的な処理としては`JOIN`～`ON`の評価は以下の三段階に分かれています。

  1. `JOIN`句のテーブルを評価し、直積を求める。(≒`CROSS JOIN`)
  2. `ON`句の条件に該当しない行を除外する。
  3. `OUTER JOIN`である場合は必要な未結合の行を追加する。

ですので評価の開始はかならず`JOIN`が先なのですが、完了順では遅くなる場合があります。またこの場合は`ON`の評価に使用した行とは異なる結果が出力されます。TechNetの記述はバインド順についての言及であるので、結果セットの確定タイミングを踏まえて`JOIN`を後ろにしているのではないでしょうか。

なお詳細な評価プロセスはMicrosoftが出版しているリファレンスである『T-SQL
Qerying』で説明されています。当該書籍に説明されている`SELECT`文の完全な評価フローは以下のようになります。[![T-SQL Logical
Query Processing
Flow](https://i.stack.imgur.com/MIbtv.png)](https://i.stack.imgur.com/MIbtv.png)


CC BY-SA 3.0
2017-04-02T06:50:16.860
33709
2017-04-02T09:39:53.213
2017-04-02T09:39:53.213
5750
5750
33708
answer


SQLはインタプリタではないので、構文解析をすることと式を評価することは別です。

>
[code]

>     select * from data d inner join mst m on m.num=d.num
>  
[/code]

構文解析中に`data`テーブルに`d`と名を付け、`mst`テーブルに`m`を名を付けた上で、実行時に`m.num`と`d.num`にアクセスしているに過ぎません。

> 評価順序の関係でSELECT句に付した別名がWHERE句で使用できないことに対応する

わけではありません。`SELECT`句でカラムに名前を付けたとしても、実行時、`WHERE`句の段階ではまだ`SELECT`句が実行されておらず値が存在しないためにアクセスできないだけです。


CC BY-SA 3.0
2017-04-02T08:54:10.737
33712
2017-04-02T08:54:10.737
4236
33708
answer