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

結合が存在しないレコードを検索する

    EXISTSを使用する 式:

    WHERE NOT EXISTS (
       SELECT FROM votes v  -- SELECT list can be empty
       WHERE  v.some_id = base_table.some_id
       AND    v.user_id = ?
       )
    

    違い

    ... NOT EXISTS()の間 (Ⓔ)およびNOT IN() (Ⓘ)は2つあります:

    1. パフォーマンス

      Ⓔは一般的に高速です。最初の一致が見つかるとすぐにサブクエリの処理を停止します。マニュアル:

      サブクエリは通常、完了までではなく、少なくとも1つの行が返されるかどうかを判断するのに十分な時間だけ実行されます。

      Ⓘはクエリプランナーで最適化することもできますが、NULL以降はそれほどではありません。 処理がより複雑になります。

    2. 正しさ

      サブクエリ式の結果の値の1つがNULLの場合 、Ⓘの結果はNULLです 、一般的なロジックはTRUEを期待しますが -およびⒺはTRUEを返します 。マニュアル:

      行ごとのすべての結果が等しくないかnullであり、少なくとも1つのnullがある場合、NOT INの結果 nullです。

    基本的に、(NOT) EXISTS ほとんどの場合、より良い選択です。

    クエリは次のようになります:

    SELECT *
    FROM   questions q
    WHERE  NOT EXISTS (
        SELECT FROM votes v 
        WHERE  v.question_id = q.id
        AND    v.user_id = ?
        );
    

    しない votesに参加する 基本クエリで。それは努力を無効にするでしょう。

    NOT EXISTS以外に およびNOT IN LEFT JOIN / IS NULLには追加の構文オプションがあります およびEXCEPT 。参照:

    • 他のテーブルに存在しない行を選択します


    1. ScaleGridは、マネージドデータベースホスティング用のOracleCloudを追加します

    2. PostgreSQLの日付に序数標識を追加する

    3. 矢印表記

    4. SQL ServerのCAST()とTRY_CAST():違いは何ですか?