В 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
Този път получаваме ученици, които не са и учители.
EXCEPT
на SQLite операторът връща само отделни редове. Така че в нашия пример се връща само един ред за Cathy
, въпреки че има двама учители с това име.
Някои други 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