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
参考文献:
句に含まれていた条件は、集計関数の結果を参照しているため (適用後WHERE
) 、句に移動する必要があります。また、入力列のみを参照できる節では、出力列(列の別名) を参照できません。したがって、式を繰り返す必要があります。マニュアル:HAVING
WHERE
HAVING
出力列の名前は、
ORDER BY
andGROUP BY
句で列の値を参照するために使用できますが、WHERE
orHAVING
句では使用できません。代わりに式を書き出す必要があります。
節内のテーブルの順序を逆にFROM
し、構文を少しクリーンアップして混乱を減らしました。USING
ここでは便宜上の表記にすぎません。
LEFT JOIN
の代わりに使用したJOIN
ため、ログのないライセンスは除外されません。
によってカウントされるのは、null 以外の値のみcount()
です。テーブル内の関連するエントリをカウントしたいので、"Log"
より安全で、使用する方がわずかに安価count(b.license_id)
です。この列は結合で使用されるため、列が null になるかどうかを気にする必要はありません。
count(*)
はさらに短く、わずかに高速です。左のテーブルの行のカウントを取得しても構わない場合は、それを使用して1
ください。0
余談ですが、可能であれば、Postgres で大文字と小文字が混在する識別子を使用しないことをお勧めします。非常にエラーが発生しやすい。