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