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