Sdílet prostřednictvím


Operátory set – EXCEPT a INTERSECT (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Vrátí jedinečné řádky porovnáním výsledků dvou dotazů.

KROMĚ vrátí odlišné řádky z levého vstupního dotazu, které nejsou výstupem správného vstupního dotazu.

Funkce INTERSECT vrátí jedinečné řádky, které jsou výstupem operátoru levých i pravých vstupních dotazů.

Pokud chcete zkombinovat sady výsledků dvou dotazů, které používají KROMĚ nebo INTERSECT, jsou základní pravidla:

  • Číslo a pořadí sloupců musí být ve všech dotazech stejné.

  • Datové typy musí být kompatibilní.

Transact-SQL konvence syntaxe

Syntax

{ <query_specification> | ( <query_expression> ) }   
{ EXCEPT | INTERSECT }  
{ <query_specification> | ( <query_expression> ) }  

Arguments

< > query_specification | ( <query_expression> )
Je specifikace dotazu nebo výraz dotazu, který vrací data, která se mají porovnat s daty z jiné specifikace dotazu nebo výrazu dotazu. Definice sloupců, které jsou součástí operace EXCEPT nebo INTERSECT, nemusí být stejné. Musí však být srovnatelné prostřednictvím implicitního převodu. Pokud se datové typy liší, pravidla pro prioritu datového typu určují datový typ, který se spustí pro porovnání.

Výsledek je založený na stejných pravidlech pro kombinování výrazů, pokud jsou typy stejné, ale liší se v přesnosti, stupnici nebo délce. Další informace naleznete v tématu Přesnost, Měřítko a Délka (Transact-SQL).

Specifikace dotazu nebo výraz nemůžou vracet sloupce typu definované uživatelem xml, text, ntext, obrázek nebo nebinární typ CLR, protože tyto datové typy nejsou srovnatelné.

EXCEPT
Vrátí všechny odlišné hodnoty z dotazu nalevo od operátoru EXCEPT. Tyto hodnoty se vrátí tak dlouho, dokud správný dotaz nevrací tyto hodnoty.

INTERSECT
Vrátí všechny jedinečné hodnoty vrácené dotazem na levé i pravé straně operátoru INTERSECT.

Remarks

Datové typy srovnatelných sloupců vrací dotazy vlevo a vpravo od operátorů EXCEPT nebo INTERSECT. Tyto datové typy mohou obsahovat datové typy znaků s různými kolacemi. Když to uděláte, spustí se požadované porovnání podle pravidel priority kolace. Pokud tento převod nemůžete spustit, databázový stroj SQL Serveru vrátí chybu.

Při porovnávání hodnot sloupců pro určení řádků DISTINCT se považují dvě hodnoty NULL za stejné.

KROMĚ a INTERSECT vrátí názvy sloupců sady výsledků, které jsou stejné jako názvy sloupců, které dotaz na levé straně operátoru vrátí.

Názvy sloupců nebo aliasy v klauzulích ORDER BY musí odkazovat na názvy sloupců vrácené levým dotazem.

Nulová hodnota libovolného sloupce v sadě výsledků vrácených parametrem EXCEPT nebo INTERSECT je stejná jako nulová hodnota odpovídajícího sloupce vráceného dotazem na levé straně operátoru.

Pokud se funkce EXCEPT nebo INTERSECT používá společně s jinými operátory ve výrazu, vyhodnotí se v kontextu následující priority:

  1. Výrazy v závorkách

  2. Operátor INTERSECT

  3. KROMĚ A UNION vyhodnocené zleva doprava na základě jejich pozice ve výrazu

K porovnání více než dvou sad dotazů můžete použít funkci EXCEPT nebo INTERSECT. Když to uděláte, převod datového typu se určí porovnáním dvou dotazů najednou a podle dříve zmíněných pravidel vyhodnocení výrazu.

S VÝJIMKOU a INTERSECT nelze použít v distribuovaných definicích rozděleného zobrazení, oznámení dotazu.

KROMĚ a INTERSECT lze použít v distribuovaných dotazech, ale spouští se pouze na místním serveru a ne nasdílené na odkazovaný server. Použití funkce EXCEPT a INTERSECT v distribuovaných dotazech může mít vliv na výkon.

Pokud se používají s operací EXCEPT nebo INTERSECT, můžete v sadě výsledků použít rychlé kurzory pouze vpřed a statické kurzory. Můžete také použít klávesovou sadu řízenou nebo dynamickou kurzor společně s operací EXCEPT nebo INTERSECT. Když to uděláte, kurzor sady výsledků operace se převede na statický kurzor.

Pokud je operace EXCEPT zobrazena pomocí grafické showplan funkce v APLIKACI SQL Server Management Studio, zobrazí se operace jako levý antimimi spojení a operace INTERSECT se zobrazí jako levé středník spojení.

Examples

Následující příklady ukazují použití INTERSECT operátorů a EXCEPT operátorů. První dotaz vrátí všechny hodnoty z Production.Product tabulky pro porovnání s výsledky a INTERSECTEXCEPT.

-- Uses AdventureWorks  
  
SELECT ProductID   
FROM Production.Product ;  
--Result: 504 Rows  

Následující dotaz vrátí všechny jedinečné hodnoty, které vrací dotaz na levé i pravé straně operátoru INTERSECT .

-- Uses AdventureWorks  
  
SELECT ProductID   
FROM Production.Product  
INTERSECT  
SELECT ProductID   
FROM Production.WorkOrder ;  
--Result: 238 Rows (products that have work orders)  

Následující dotaz vrátí všechny odlišné hodnoty z levého dotazu operátoru EXCEPT , které nejsou nalezeny také v pravém dotazu.

-- Uses AdventureWorks  
  
SELECT ProductID   
FROM Production.Product  
EXCEPT  
SELECT ProductID   
FROM Production.WorkOrder ;  
--Result: 266 Rows (products without work orders)  

Následující dotaz vrátí všechny odlišné hodnoty z levého dotazu operátoru EXCEPT , které nejsou nalezeny také v pravém dotazu. Tabulky jsou obrácené z předchozího příkladu.

-- Uses AdventureWorks  
  
SELECT ProductID   
FROM Production.WorkOrder  
EXCEPT  
SELECT ProductID   
FROM Production.Product ;  
--Result: 0 Rows (work orders without products)  

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

Následující příklady ukazují, jak používat operátory INTERSECT a EXCEPT operátory. První dotaz vrátí všechny hodnoty z FactInternetSales tabulky pro porovnání s výsledky a INTERSECTEXCEPT.

-- Uses AdventureWorks  
  
SELECT CustomerKey   
FROM FactInternetSales;  
--Result: 60398 Rows  

Následující dotaz vrátí všechny jedinečné hodnoty, které vrací dotaz na levé i pravé straně operátoru INTERSECT .

-- Uses AdventureWorks  
  
SELECT CustomerKey   
FROM FactInternetSales    
INTERSECT   
SELECT CustomerKey   
FROM DimCustomer   
WHERE DimCustomer.Gender = 'F'  
ORDER BY CustomerKey;  
--Result: 9133 Rows (Sales to customers that are female.)  

Následující dotaz vrátí všechny odlišné hodnoty z levého dotazu operátoru EXCEPT , které nejsou nalezeny také v pravém dotazu.

-- Uses AdventureWorks  
  
SELECT CustomerKey   
FROM FactInternetSales    
EXCEPT   
SELECT CustomerKey   
FROM DimCustomer   
WHERE DimCustomer.Gender = 'F'  
ORDER BY CustomerKey;  
--Result: 9351 Rows (Sales to customers that are not female.)