sql >> Databáze >  >> RDS >> SQLite

SQLite KROMĚ operátora

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      

  1. Vraťte konec měsíce v SQLite

  2. SQL DROP COLUMN pro začátečníky

  3. Efektivní monitorování MySQL pomocí SCUMM Dashboards:Část první

  4. Java SQL ERROR:Relation Table_Name neexistuje