0

私の知る限り、少なくともSQL Serverでは、テーブルとの結合に使用されているセット内のテーブルのエイリアスを使用することはできません。

例:

CREATE TABLE A (A1 int, A2 int)
CREATE TABLE B (B1 int, B2 int)
SELECT a.A2
FROM
  A as a
INNER JOIN
  (SELECT * FROM B as b WHERE b.B1=a.A1) b2 ON b2.B2=a.A2

エイリアスが参照するテーブル( A )に結合されるセットでエイリアスaが使用されているため、このクエリはエラーになります。

SQL Serverでは、これはCROSS APPLYを使用するか、クエリを書き直すことで解決できます。(これは私の質問ではありません)。

私の質問は:なぜこの制限が存在するのですか?、SQL Server CROSS APPLYとしてエイリアスを使用してみませんか?

私の最初の推測は:並列処理です。これを制限できれば、結合されているように見える各セットを常に並行して計算してから結合することができます。しかし、それは単なる推測です。CROSS APPLYのように、より柔軟になり、エイリアスを使用して、結合セット間の依存関係を計算できるようになります。

多分理由はありません:)

4

1 に答える 1

3

この制限は、標準SQLのスコープ規則のために存在します。from句内の1つのテーブルは、別のテーブル内で何が起こっているかを認識していません。SQLは手続き型言語ではなく、記述言語であることを忘れないでください。句内のテーブルの順序は、必ずしもそれらが処理される実際の順序に関連しているわけではありません。from

句が最初に評価されるため、この制限はSELECT、、、WHEREおよびHAVING句には適用されません。FROM

cross apply同じか違うかjoin。結合を作成する方法はたくさんありますが、明示的なjoin構文はそのうちの1つにすぎません。相関サブクエリ、selects内のネストされたクエリ、existsサブクエリ、およびinサブクエリはすべて、リレーショナル結合操作のいくつかのバリアントを実行しています。それらは異なって表現されます。

サブクエリでの使用cross applyも、一般に、結合のタイプです。Windows関数をネストして使用する非常に複雑なクエリでは、クエリを明示的な結合として書き直すことができない場合があります。しかし、ほとんどの場合、私はそれができました。

于 2013-02-12T01:26:07.017 に答える