V SQLite, EXCEPT operátor lze použít k vytvoření složeného SELECT příkaz, který vrací podmnožinu řádků vrácených levým SELECT které nejsou vráceny správným SELECT .
Příklad
Předpokládejme, že máme následující tabulky:
SELECT * FROM Teachers;
SELECT * FROM Students; Výsledek:
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
Můžeme použít EXCEPT operátor vrátit učitele, kteří nejsou zároveň studenty:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students; Výsledek:
TeacherName ----------- Ben Cathy
Získáváme tedy pouze hodnoty, které se objevují v Teachers tabulka, která se také neobjevuje v Students stůl.
Můžeme získat různé výsledky podle toho, která tabulka je vlevo a která vpravo. Zde je příklad, který uvádí Students tabulka vlevo a Teachers vpravo:
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers; Výsledek:
StudentName ----------- Ein Faye Jet Spike
Tentokrát dostáváme studenty, kteří nejsou zároveň učiteli.
EXCEPT od SQLite operátor vrací pouze odlišné řádky. V našem příkladu je tedy vrácen pouze jeden řádek pro Cathy , i když jsou dva učitelé s tímto jménem.
Některé další RDBMS nám umožňují zahrnout duplikáty do výsledku přijetím volitelného ALL klíčové slovo s jejich EXCEPT operátor, ale SQLite ne (alespoň ne v době psaní). Pro případ, že by se něco změnilo, neváhejte zkontrolovat dokumentaci SQLite.
Alternativa
Je možné získat stejný výsledek bez použití EXCEPT operátor. Například bychom mohli přepsat náš první příklad na toto:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName); Výsledek:
TeacherName ----------- Ben Cathy