SQLiteでは、EXCEPT
演算子を使用して、複合SELECT
を作成できます 左側のSELECT
によって返される行のサブセットを返すステートメント 正しいSELECT
によって返されないもの 。
次のテーブルがあるとします。
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 ----------- Ben Cathy
したがって、Teachers
に表示される値のみを取得します Students
にも表示されないテーブル テーブル。
左側にあるテーブルと右側にあるテーブルに応じて、異なる結果を得ることができます。 Students
を配置する例を次に示します。 左側の表とTeachers
右側:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
結果:
StudentName ----------- Ein Faye Jet Spike
今回は、教師ではない生徒を迎えます。
SQLiteのEXCEPT
演算子は個別の行のみを返します。したがって、この例では、Cathy
に対して1行だけが返されます。 、その名前の先生が2人いるのに。
他のいくつかのRDBMSでは、オプションのALL
を受け入れることで、結果に重複を含めることができます。 EXCEPT
を含むキーワード 演算子ですが、SQLiteはそうではありません(少なくとも、執筆時点ではそうではありません)。何か変更があった場合は、SQLiteのドキュメントを確認してください。
EXCEPT
を使用しなくても同じ結果を得ることができます オペレーター。たとえば、最初の例を次のように書き直すことができます。
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
結果:
TeacherName ----------- Ben Cathy