Condividi tramite


EXCEPT e INTERSECT (Transact-SQL)

Restituiscono valori distinti eseguendo un confronto dei risultati di due query.

EXCEPT restituisce tutti i valori distinti della query a sinistra dell'operando non presenti nella query a destra.

INTERSECT restituisce tutti i valori distinti restituiti da entrambe le query a sinistra e a destra dell'operando INTERSECT.

Le regole di base per la combinazione dei set di risultati di due query che utilizzano EXCEPT o INTERSECT sono le seguenti:

  • Tutte le query devono includere lo stesso numero di colonne nello stesso ordine.

  • I tipi di dati devono essere compatibili.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

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

Argomenti

  • <query_specification> | ( <query_expression> )
    Specifica di query o espressione di query che restituisce dati da confrontare con i dati di un'altra specifica o espressione di query. Le definizioni delle colonne coinvolte in un'operazione EXCEPT o INTERSECT non devono essere necessariamente identiche, ma devono essere confrontabili tramite una conversione implicita. Se i tipi di dati sono diversi, il tipo utilizzato per eseguire il confronto e restituire i risultati viene determinato in base alle regole riguardanti la precedenza dei tipi di dati.

    Se i tipi sono gli stessi ma la precisione, la scala o la lunghezza è diversa, il risultato viene determinato in base alle stesse regole previste per la combinazione di espressioni. Per ulteriori informazioni, vedere Precisione, scala e lunghezza (Transact-SQL).

    La specifica o l'espressione di query non può restituire colonne xml, text, ntext, image o con un tipo di dati CLR definito dall'utente non binario perché questi tipi di dati non sono confrontabili.

  • EXCEPT
    Restituisce tutti i valori distinti della query a sinistra dell'operando EXCEPT che non vengono restituiti dalla query a destra.

  • INTERSECT
    Restituisce tutti i valori distinti restituiti da entrambe le query a sinistra e a destra dell'operando INTERSECT.

Osservazioni

Quando le colonne confrontabili restituite dalle query a sinistra e a destra dell'operando EXCEPT o INTERSECT utilizzano tipi di dati character con regole di confronto diverse, il confronto viene eseguito in base alle regole riguardanti la precedenza delle regole di confronto. Se non è possibile eseguire questa conversione, in Motore di database di SQL Server viene visualizzato un messaggio di errore.

Durante il confronto di righe per la determinazione di valori distinti, due valori NULL vengono considerati uguali.

I nomi di colonna del set di risultati restituiti da EXCEPT o INTERSECT corrispondono a quelli restituiti dalla query a sinistra dell'operando.

I nomi o gli alias di colonna in clausole ORDER BY devono fare riferimento a nomi di colonna restituiti dalla query a sinistra dell'operando.

Il supporto di valori Null in qualsiasi colonna del set di risultati restituita da EXCEPT o INTERSECT equivale a quello della colonna corrispondente restituita dalla query a sinistra dell'operando.

Se EXCEPT o INTERSECT viene utilizzato insieme ad altri operatori all'interno di un'espressione, viene valutato in base all'ordine di precedenza seguente:

  1. Espressioni racchiuse tra parentesi

  2. Operando INTERSECT

  3. EXCEPT e UNION, valutati da sinistra verso destra in base alla relativa posizione nell'espressione

Se EXCEPT o INTERSECT viene utilizzato per confrontare più di due set di query, la conversione dei tipi di dati viene determinata tramite il confronto di due query alla volta e in base alle regole sopra indicate per la valutazione delle espressioni.

EXCEPT e INTERSECT non possono essere utilizzati in definizioni di viste partizionate distribuite, in notifiche di query o insieme a clausole COMPUTE e COMPUTE BY.

EXCEPT e INTERSECT possono essere utilizzati in query distribuite, ma vengono eseguiti solo nel server locale e non è possibile eseguirne il push nel server collegato. Pertanto, l'utilizzo di EXCEPT e INTERSECT in query distribuite può influire sulle prestazioni.

I cursori fast forward-only e statici utilizzati con un'operazione EXCEPT o INTERSECT sono pienamente supportati nel set di risultati. Se con un'operazione EXCEPT o INTERSECT viene utilizzato un cursore gestito da keyset o dinamico, il cursore del set di risultati dell'operazione viene convertito in un cursore statico.

Quando un'operazione EXCEPT viene visualizzata tramite la caratteristica Showplan grafico di SQL Server Management Studio, viene indicata come left anti semi join, mentre un'operazione INTERSECT viene indicata come left semi join.

Esempi

Negli esempi seguenti viene illustrato l'utilizzo degli operandi INTERSECT e EXCEPT. La prima query restituisce tutti i valori della tabella Production.Product per il confronto con i risultati ottenuti con INTERSECT e EXCEPT.

USE AdventureWorks2008R2;
GO
SELECT ProductID 
FROM Production.Product ;
--Result: 504 Rows

La query seguente restituisce tutti i valori distinti restituiti da entrambe le query a sinistra e a destra dell'operando INTERSECT.

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

La query seguente restituisce tutti i valori distinti della query a sinistra dell'operando EXCEPT non presenti nella query a destra.

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

La query seguente restituisce tutti i valori distinti della query a sinistra dell'operando EXCEPT non presenti nella query a destra. Vengono utilizzate tabelle invertite rispetto a quelle dell'esempio precedente.

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