Můžete použít T-SQL EXCEPT
operátor na serveru SQL Server, který vrátí odlišné řádky z levého vstupního dotazu, které nejsou na výstupu pravého vstupního dotazu.
Syntaxe
Syntaxe vypadá takto:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
Dokumentace společnosti Microsoft ve skutečnosti obsahuje INTERSECT
operátor v jeho definici, protože stejná syntaxe platí pro EXCEPT
a INTERSECT
.
Syntaxe Microsoftu vypadá takto:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Příklad
Představte si, že máte dva stoly; Cats
a Dogs
.
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Brush | | 2 | Scarcat | | 3 | Flutter | | 4 | Flutter | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Yelp | | 2 | Woofer | | 3 | Brush | | 4 | Brush | +---------+-----------+
Můžeme použít EXCEPT
operátor vrátí pouze odlišné řádky z levého vstupního dotazu, které nejsou zobrazeny pravým vstupním dotazem.
Zde je příklad.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Výsledek:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Získáváme tedy pouze hodnoty, které se objevují v Cats
tabulka, která se také neobjevuje v Dogs
stůl. Jak bylo zmíněno, vrací odlišné řádky, takže pro Flutter
je vrácen pouze jeden řádek .
Můžeme to také přepnout a umístit Dogs
tabulka vlevo a Cats
vpravo.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Výsledek:
+-----------+ | DogName | |-----------| | Woofer | | Yelp | +-----------+
EXCEPT
operátor se objeví jako LEFT ANTI SEMI JOIN
v prováděcím plánu.
Náš první příklad je tedy podobný následujícímu:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Výsledek:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Pamatujte, že při použití EXCEPT
, počet a pořadí sloupců musí být ve všech dotazech stejné. Také datové typy musí být kompatibilní. Ve skutečnosti nemusí být stejné, ale musí být srovnatelné prostřednictvím implicitní konverze.
Také při porovnávání hodnot sloupců pro určení DISTINCT
řádky, dva NULL
hodnoty jsou považovány za stejné.
Pokud máte v úmyslu použít EXCEPT
v distribuovaných dotazech si uvědomte, že se spouštějí pouze na místním serveru a nejsou odesílány na propojený server, a to by proto mohlo ovlivnit výkon.