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

SELECT COUNT(*)-一致する行がない場合、グループ化されたフィールドとともに0を返します

    ありえない?勝負を受けて立つ。 :)

    WITH x(employee, department) AS (
       VALUES
        (1::int, 2::int)
       ,(3, 4)
       ,(5, 6)
        -- ... more combinations
       )
    SELECT x.employee, x.department, count(i.employee) AS ct
    FROM   x
    LEFT   JOIN items i ON i.employee = x.employee
                       AND i.department = x.department
                       AND i.available
    GROUP  BY x.employee, x.department;
    

    これにより、正確に あなたが求めているもの。 employeeの場合 およびdepartment 整数ではなく、一致するタイプにキャストされます。

    @ypercubeからのコメントごと:count()はitemsのnull以外の列にある必要があります 、したがって、0を取得します 1ではなく、存在しない基準の場合 。

    また、追加の基準をLEFT JOINにプルアップします 状態(i.available この場合)、存在しない基準を除外しないでください。

    パフォーマンス

    コメントで追加の質問に対処します。
    これは非常にうまく機能するはずです。基準のリストが長い場合は、(LEFT) JOIN おそらく最速の方法です。

    できるだけ早く必要な場合は、必ずmulticolumnを作成してください。インデックス のように:

    CREATE INDEX items_some_name_idx ON items (employee, department);
    

    (employee, department)の場合 PRIMARY KEYである必要があります または、UNIQUEが必要です 2つの列に制約を課すと、それでもうまくいきます。



    1. MySQL LOAD DATALOCALINFILE中の不正な形式のパケットエラー

    2. VS2019とMySQLEntityFrameworkのデータベース名が重複しています

    3. 私のc#アプリケーションで*.sqlmysqlファイルを実行する方法

    4. 内部結合とin()句のパフォーマンスはどこですか?