0

クエリで同じエイリアス (RankedPrice) を 2 回使用しています。エラーが発生することを期待していました。しかし、それはうまくいきました。なぜこれが起こるのですか?C++ や Java のような変数スコープ エラーが発生することを期待していましたが、発生しません。

select *
from
(select *, RANK() over(order by retailprice) as RankedPrice
from CurrentProducts) as RankedPrice
where RankedPrice = 5
4

2 に答える 2

3

SQL の仕組みにより、特定の参照で参照しているオブジェクトのタイプについて混乱することはありません。

がある場合はSELECT a, ...、それが列への参照であることを知ってaいます。テーブル、データベース、ストアド プロシージャ、UDF などへの参照はできません (*)。

がある場合は、それがテーブルへの参照(+)であり、それが列への参照SELECT a.b, ...であることがわかります。(*)ab

したがって、テーブルと列の両方が同じ名前を持つ列をテーブルに含めることを排除する論理的な理由はありません。


(*) - これはSELECT条項に適用されます。節ではFROM、単一部分の名前は table(+) のみ、2 部分の名前は schema + table のみ、などです。ただし、各節では、参照されるオブジェクトのタイプは常に明確です。

(+) - ここで本当に意味するのは、行ソース (テーブル、ビュー、CTE) です。必要に応じて、テーブルとして構築し、クエリの代わりに使用できるもの。


他の人が言ったように、サブクエリに同じエイリアスを導入することにも障害はありません。しかし、それはここでは起こっていませんRankedPrice.RankedPrice

于 2013-01-13T08:11:10.407 に答える
1

親クエリとネストされたサブクエリでは、エイリアスの名前空間が異なります。したがって、ネストされたサブクエリで同じエイリアスを使用しても問題ありませんが、コードを読んでいる人にとっては少し混乱するかもしれません。

コードRankedPriceでは、最初に列のエイリアスとして使用され、次に派生テーブルのエイリアスとして使用されますが、前述の名前空間の分離により衝突が防止されます。

また、相関サブクエリには単一の共有名前空間があることも指摘しておく必要があります。

于 2013-01-13T08:08:44.357 に答える