2016-06-26 2 views
6

に列別名を受け入れていない、答えは次のように与えられる:PostgreSQLは3種類のテーブルを結合については、この<a href="https://pgexercises.com/questions/joins/threejoin2.html" rel="nofollow noreferrer">pgexercises</a>でWHERE句

私は SELECTリストに costエイリアスを参照することができないのはなぜ
select mems.firstname || ' ' || mems.surname as member, 
    facs.name as facility, 
    case 
     when mems.memid = 0 then 
      bks.slots*facs.guestcost 
     else 
      bks.slots*facs.membercost 
    end as cost 
     from 
       cd.members mems     
       inner join cd.bookings bks 
         on mems.memid = bks.memid 
       inner join cd.facilities facs 
         on bks.facid = facs.facid 
     where 
     bks.starttime >= '2012-09-14' and 
     bks.starttime < '2012-09-15' and (
      (mems.memid = 0 and bks.slots*facs.guestcost > 30) or 
      (mems.memid != 0 and bks.slots*facs.membercost > 30) 
     ) 
order by cost desc; 

WHERE句?
私は同じクエリを実行する場合:

 ... 
     where 
     bks.starttime >= '2012-09-14' and 
     bks.starttime < '2012-09-15' and 
     cost > 30 
order by cost desc; 

エラーが発生します。

ERROR: column "cost" does not exist 

それはそれがために、評価のためのだとthis answerから私と一緒に明らかです。しかし、なぜorder by cost desc;が許可されるのですか?

+2

Videの[Selectステートメントの評価の概念順](http://tinman.cs.gsu.edu/~raj/sql /node22.html)。最初に – klin

+0

私はあなたの質問を誤解しました:)今私は完全に上記のステートメントでaggre –

+2

コストステートメントは、whereステートメントが適用されるときに返されるレコードセットより前に存在しません。レコードセットが作成された後にORDER BYステートメントが適用され、列エイリアスが使用可能であることを意味します。 – Matt

答えて

10

は、次の2つの質問をする: 1.

は、なぜ私はWHERE句でSELECTコストエイリアスを参照することはできません

2.

しかし、なぜコストDESCによって順。許可されています?


manual has an answer for both of them here:

出力列の名前はなく、WHERE又はHAVING 節において、 ORDER BY及びGROUP BY句で列の値を参照するために使用することができます。代わりに式を書き出す必要があります。

それは、SQL標準との理由で定義されていますがSELECTクエリ内のイベントのシーケンスです。 WHERE句が適用された時点で、SELECTリストの出力列はまだ計算されていません。しかし、ORDER BYの場合、出力カラムはすぐに利用できます。

これは最初は不便で混乱していましたが、まだまだ意味があります。

関連:

関連する問題

 関連する問題