sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLWhereカウント条件

    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で。エラーが発生しやすい。



    1. オフラインで使用するために解析されたJSONをキャッシュする方法

    2. 結果を取得するときにあいまいな列名を解決するにはどうすればよいですか?

    3. MySQLでテーブルのピボットを解除する方法

    4. justify_hours()がPostgreSQLでどのように機能するか