SELECT a.license_id, a.limit_call
, count(b.license_id) AS overall_count
FROM "License" a
LEFT JOIN "Log" b USING (license_id)
WHERE a.license_id = 7
GROUP BY a.license_id -- , a.limit_call -- add in old versions
HAVING a.limit_call > count(b.license_id)
Postgres 9.1以降、主キーはGROUP BY
のテーブルのすべての列をカバーします 句。古いバージョンでは、a.limit_call
を追加する必要があります GROUP BY
へ リスト。 9.1のリリースノート:
GROUP BY
以外を許可するGROUP BY
で主キーが指定されている場合のクエリターゲットリストの列 条項
さらに読む:
- キーで集計するときに、従属列を `GROUP BY`から除外できないのはなぜですか?
WHERE
での状態 句はHAVING
に移動する必要があります 集計関数の結果を参照するため(後 WHERE
適用された)。また、出力列を参照することはできません (列エイリアス)HAVING
句。ここでは、入力列のみを参照できます。したがって、式を繰り返す必要があります。マニュアル:
出力列の名前を使用して、
ORDER BY
の列の値を参照できます。 およびGROUP BY
句はありますが、WHERE
にはありません またはHAVING
条項;そこで、代わりに式を書き出す必要があります。
FROM
のテーブルの順序を逆にしました 句を追加し、構文を少しクリーンアップして、混乱を少なくしました。 USING
ここでは単なる表記上の便宜です。
LEFT JOIN
を使用しました JOIN
の代わりに 、したがって、ログのないライセンスを除外することはありません。
null以外の値のみがcount()
によってカウントされます 。 関連するエントリを数えたいので テーブル"Log"
内 count(b.license_id)
を使用する方が安全で、わずかに安価です。 。この列は結合で使用されるため、列をnullにできるかどうかを気にする必要はありません。
count(*)
まだ短く、わずかに高速です。 1
のカウントを取得してもかまわない場合 0
の場合 左の表の行は、それを使用してください。
余談ですが、しないことをお勧めします 混合ケース識別子を使用するには 可能であればPostgresで。エラーが発生しやすい。