次のクエリで、サブクエリfoo
の外側でWHERE foo.row_num < 3
句を使用して各パーティションから返される結果を制限する必要があるのに、WHERE row_num < 3
のサブクエリ内からではないのはなぜですか?
クエリ
SELECT pid, land_type, row_num, road_name, round(CAST(dist_km AS numeric), 2) AS dist_km
FROM (
SELECT ROW_NUMBER()
OVER (
PARTITION by loc.pid
ORDER BY ST_Distance(r.the_geom, loc.the_geom)
) as row_num,
loc.pid, loc.land_type, r.road_name,
ST_Distance(r.the_geom, loc.the_geom)/1000 as dist_km
FROM ch05.land AS loc
LEFT JOIN ch05.road AS r
ON ST_DWithin(r.the_geom, loc.the_geom, 1000)
WHERE loc.land_type = 'police station'
) AS foo
WHERE foo.row_num < 3
ORDER BY pid, row_num;
機能しないクエリ
SELECT pid, land_type, row_num, road_name, round(CAST(dist_km AS numeric), 2) AS dist_km
FROM (
SELECT ROW_NUMBER()
OVER (
PARTITION by loc.pid
ORDER BY ST_Distance(r.the_geom, loc.the_geom)
) as row_num,
loc.pid, loc.land_type, r.road_name,
ST_Distance(r.the_geom, loc.the_geom)/1000 as dist_km
FROM ch05.land AS loc
LEFT JOIN ch05.road AS r
ON ST_DWithin(r.the_geom, loc.the_geom, 1000)
WHERE loc.land_type = 'police station'
AND row_num < 3
) AS foo
ORDER BY pid, row_num;
エラー:ERROR: column "row_num" does not exist
列 "row_num"は存在しません。処理の論理的な順序は、dbmsがSELECT句を評価する前にWHERE句を適用する必要があるためです。ウィンドウ関数はSELECT句の一部であるため、同じステートメントのWHERE句ではエイリアスにアクセスできません。
FROM句は、評価されるステートメントの最初の部分です。そのため、FROM句で宣言したエイリアスは、同じステートメントのWHERE句でアクセスできます。
検索 このページ 「論理処理順序」。これはSQL Serverのドキュメントにリンクしていますが、処理の論理的な順序は、SQL標準に準拠するすべてのdbmsで同じです。