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