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

COUNT('e.id')またはCOUNT(e.id)のクエリとは異なる結果があります

    'e.id' は文字列定数なので、COUNT('e.id') COUNT(*)の言い方は厄介で誤解を招くだけです。 。

    COUNT(e.id) 一方、e.id IS NOT NULLである結果のすべての行をカウントします -count()以降 NULL値はカウントされません。

    count()に関するマニュアル :

    ご覧のとおり、内部には2つの別個の関数もあります。また、count(*) 少し速いです。したがって、必要でない限り、これを使用してください。 2番目のバリアント。関連:

    次のように反論するかもしれません:
    "しかし、e.id PRIMARY KEYです。 core_employmentsの 、したがって、NOT NULLと定義されています !"

    しかし、それは条件付きLEFT JOINを見落とします。 それでもNULLを導入するクエリで NOT NULLの値 結合条件が満たされていない列。関連:

    そうは言っても、LEFT [OUTER] JOIN 誤解を招くこともあります。後の状態

    having("COUNT(e.id) = 1")
    

    プレーンな[INNER] JOINのように動作するように強制します 。これを修正したら、次のように簡略化することをお勧めします。

    having("COUNT(*) = 1")
    

    そして、あなたが気にするのがそれだけなら少なくとも 1つの関連する行がcore_employmentsに存在します 、having("COUNT(*) >= 1")に変換します 、単純な場合の優れた(より明確で高速な)手法は、 EXISTS セミジョイン

    WHERE EXISTS (SELECT FROM core_employments WHERE <conditions>)
    



    1. DockerComposeでPostgresデータベースを初期化します

    2. コレクション型oracle12cから表に挿入-ORA-00902:無効なデータ型

    3. $mysqli->insert_idと同等のpostgresql

    4. MySQLの大文字と小文字を区別しないが、アクセントを区別するUTF8一意キー