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