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

EXCEPTがPostgreSQLでどのように機能するか

    PostgreSQLでは、EXCEPT 演算子は、右側の入力クエリでは返されない左側の入力クエリで返される行を返します。これは、差異とも呼ばれます。 2つのクエリの間。

    構文

    構文は次のようになります:

    query1 EXCEPT [ALL] query2

    EXCEPT ALLでない限り、重複は排除されます 使用されます。

    次のテーブルがあるとします。

    SELECT * FROM Teachers;
    SELECT * FROM Students;

    結果:

     teacherid | teachername 
    -----------+-------------
             1 | Warren
             2 | Ben
             3 | Cathy
             4 | Cathy
             5 | Bill
             6 | Bill
    
     studentid | studentname 
    -----------+-------------
             1 | Faye
             2 | Jet
             3 | Spike
             4 | Ein
             5 | Warren
             6 | Bill
    

    EXCEPTを使用できます 生徒ではない教師を返すためのオペレーター:

    SELECT TeacherName FROM Teachers
    EXCEPT
    SELECT StudentName FROM Students;

    結果:

     teachername 
    -------------
     Cathy
     Ben

    したがって、Teachersに表示される値のみを取得します Studentsにも表示されないテーブル テーブル。

    デフォルトでは、EXCEPT 演算子は個別の行を返します。したがって、この例では、Cathyに対して1行だけが返されます。 、その名前の先生が2人いるのに。

    上記の例は、次のクエリと同等です。

    SELECT TeacherName FROM Teachers
    EXCEPT DISTINCT
    SELECT StudentName FROM Students;

    結果:

     teachername 
    -------------
     Cathy
     Ben

    これは、明示的なDISTINCTがない場合に得られた結果と同じです。 キーワード。 ALLに重複を含めることができます キーワード(これについては後で詳しく説明します)。

    左側にあるテーブルと右側にあるテーブルに応じて、異なる結果を得ることができます。 Studentsを配置する例を次に示します。 左側の表とTeachers 右側:

    SELECT StudentName FROM Students
    EXCEPT
    SELECT TeacherName FROM Teachers;

    結果:

     studentname 
    -------------
     Faye
     Jet
     Spike
     Ein

    今回は、教師ではない生徒を迎えます。

    重複を含める

    デフォルトでは、EXCEPT 演算子は暗黙的にDISTINCTを適用します 手術。つまり、デフォルトでは個別の値のみを返します。

    ALLを含めることができます 結果に重複を含めるためのキーワード:

    SELECT TeacherName FROM Teachers
    EXCEPT ALL
    SELECT StudentName FROM Students;

    結果:

     teachername 
    -------------
     Cathy
     Cathy
     Bill
     Ben

    今回は、最初の例で取得した2行ではなく、4行を取得しました。

    最初の例のように1つだけではなく、両方のCathyが返されたことがわかります。

    ビルは? Teachersには2つの請求書があります テーブルですが、ここでは1つだけが返されます。これはおそらく、Studentsに1つの請求書があるためです。 表。これにより、請求書の1つが結果から除外されます。

    代替案

    EXCEPTを使用しなくても同じ結果を得ることができます オペレーター。たとえば、最初の例を次のように書き直すことができます。

    SELECT 
        DISTINCT TeacherName
    FROM Teachers t 
    WHERE NOT EXISTS (SELECT StudentName FROM Students s
    WHERE t.TeacherName = s.StudentName);

    結果:

     teachername 
    -------------
     Cathy
     Ben

    1. ORA-00900を解決する方法

    2. PostgreSQLデータベースを保護する方法-10のヒント

    3. SQL制約とそのさまざまなタイプとは何ですか?

    4. SQL Serverテーブルに列が存在するかどうかを確認するにはどうすればよいですか?