sql >> Databáze >  >> RDS >> Sqlserver

Jak EXCEPT funguje v SQL Server

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.


  1. Nainstalujte a nakonfigurujte MySQL Workbench na Ubuntu 16.04

  2. nelze odstranit objekt kvůli omezení cizího klíče

  3. Proaktivní monitorování PostgreSQL (úhel vývojářského studia / poradců)

  4. Softwarové společnosti, které pracují na Oracle D2k, PLSQL Technologies v Noidě