EXCEPT e INTERSECT (Transact-SQL)

Retorna valores distintos comparando os resultados de duas consultas.

EXCEPT retorna qualquer valor distinto da consulta à esquerda que também não esteja localizado na consulta à direita.

INTERSECT retorna qualquer valor distinto retornado pela consulta à esquerda e à direita do operando INTERSECT.

As regras básicas para combinar os conjuntos de resultados de duas consultas que usam EXCEPT ou INTERSECT são as seguintes:

  • O número e a ordem das colunas devem ser iguais em todas as consultas.

  • Os tipos de dados devem ser compatíveis.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • <query_specification> | ( <query_expression> )
    É uma especificação ou expressão de consulta que retorna dados a serem comparados com os dados de outra especificação ou expressão de consulta. As definições das colunas que fazem parte de uma operação EXCEPT ou INTERSECT não precisam ser iguais, mas devem ser compatíveis na conversão implícita. Quando os tipos de dados diferem, o tipo usado para executar a comparação e retornar resultados é determinado com base nas regras de precedência de tipo de dados.

    Quando os tipos são iguais mas diferem em precisão, escala ou extensão, o resultado é determinado com base nas mesmas regras para expressões de combinação. Para obter mais informações, consulte Precisão, escala e comprimento (Transact-SQL).

    A especificação ou expressão de consulta não pode retornar colunas xml, text, ntext, image ou colunas de tipo de dado CLR definido pelo usuário não binárias porque esses tipos de dados não são comparáveis.

  • EXCEPT
    Retorna qualquer valor distinto da consulta à esquerda do operando EXCEPT que não seja retornado também à direita.

  • INTERSECT
    Retorna qualquer valor distinto retornado pela consulta à esquerda e à direita do operando INTERSECT.

Comentários

Quando os tipos de dados de colunas comparáveis retornadas pelas consultas à direita e à esquerda dos operandos EXCEPT ou INTERSECT são tipos de dados de caractere com agrupamentos diferentes, a comparação necessária é executada de acordo com as regras de precedência de agrupamento. Se essa conversão não puder ser executada, o Mecanismo de Banco de Dados do SQL Server retornará um erro.

Ao comparar linhas para determinar valores distintos, dois valores NULL são considerados iguais.

Os nomes de coluna do conjunto de resultados retornados por EXCEPT ou INTERSECT são iguais aos retornados pela consulta à esquerda do operando.

Os nomes ou aliases de coluna nas cláusulas ORDER BY devem referenciar nomes de coluna retornados pela consulta à esquerda.

A nulabilidade de qualquer coluna do conjunto de resultados retornados por EXCEPT ou INTERSECT é igual à da coluna correspondente retornada pela consulta à esquerda do operando.

Se EXCEPT ou INTERSECT forem usados junto com outros operadores em uma expressão, eles serão avaliados no contexto da seguinte precedência:

  1. Expressões entre parênteses

  2. O operando INTERSECT

  3. EXCEPT e UNION avaliados da esquerda para a direita com base em sua posição na expressão

Se EXCEPT ou INTERSECT forem usados para comparar mais de dois conjuntos de consultas, a conversão de tipo de dados é determinada pela comparação de duas consultas por vez e segue as regras de avaliação de expressão mencionadas anteriormente.

EXCEPT e INTERSECT não podem ser usados em definições de exibição particionadas distribuídas, notificações de consulta ou junto com as cláusulas COMPUTE e COMPUTE BY.

EXCEPT e INETERSECT podem ser usados em consultas distribuídas, mas são executados somente no servidor local e não são enviados por push ao servidor vinculado. Portanto, o uso de EXCEPT e INTERSECT em consultas distribuídas pode afetar desempenho.

Cursores estáticos e somente de avanço rápido têm suporte total no conjunto de resultados quando são usados com uma operação EXCEPT ou INTERSECT. Se um cursor dinâmico ou controlado por conjunto de chaves for usado com uma operação EXCEPT ou INTERSECT, o cursor do conjunto de resultados da operação será convertido em um cursor estático.

Quando uma operação EXCEPT é exibida usando o recurso Plano de Execução Gráfico no SQL Server Management Studio, a operação é exibida como left anti semi join, e uma operação INTERSECT é exibida como left semi join.

Exemplos

Os exemplos a seguir mostram o uso dos operandos INTERSECT e EXCEPT. A primeira consulta retorna todos os valores da tabela Production.Product para comparar com os resultados de INTERSECT e EXCEPT.

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

A consulta a seguir retorna qualquer valor distinto retornado pela consulta à esquerda e à direita do operando INTERSECT.

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

A consulta a seguir retorna qualquer valor distinto da consulta à esquerda do operando EXCEPT que não seja encontrado também na consulta à direita.

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

A consulta a seguir retorna qualquer valor distinto da consulta à esquerda do operando EXCEPT que não seja encontrado também na consulta à direita. As tabelas são inversas às do exemplo anterior.

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