Partilhar via


Definir Operadores - EXCEPT e INTERSECT (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Retorna linhas distintas comparando os resultados de duas consultas.

EXCEPT retorna linhas distintas da consulta de entrada esquerda que não são saídas pela consulta de entrada direita.

INTERSECT retorna linhas distintas que são saídas pelo operador de consultas de entrada esquerdo e direito.

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

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

  • Os tipos de dados devem ser compatíveis.

Transact-SQL convenções de sintaxe

Syntax

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

Arguments

< > query_specification | <( query_expression> )
É uma especificação de consulta ou expressão de consulta que retorna dados a serem comparados com os dados de outra especificação de consulta ou expressão de consulta. As definições das colunas que fazem parte de uma operação EXCEPT ou INTERSECT não precisam ser as mesmas. Mas, eles devem ser comparáveis através da conversão implícita. Quando os tipos de dados diferem, as regras de precedência do tipo de dados determinam o tipo de dados que é executado para comparação.

O resultado é baseado nas mesmas regras para combinar expressões quando os tipos são os mesmos, mas diferem em precisão, escala ou comprimento. 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 xml, text, ntext, image ou colunas de tipo não binárias definidas pelo usuário CLR porque esses tipos de dados não são comparáveis.

EXCEPT
Retorna quaisquer valores distintos da consulta à esquerda do operador EXCEPT . Esses valores retornam desde que a consulta correta não retorne esses valores também.

INTERSECT
Retorna quaisquer valores distintos que são retornados pela consulta nos lados esquerdo e direito do operador INTERSECT.

Remarks

Os tipos de dados de colunas comparáveis são retornados pelas consultas à esquerda e à direita dos operadores EXCEPT ou INTERSECT. Esses tipos de dados podem incluir tipos de dados de caracteres com agrupamentos diferentes. Quando o fazem, a comparação necessária é executada de acordo com as regras de precedência da colação. Se você não puder executar essa conversão, o Mecanismo de Banco de Dados do SQL Server retornará um erro.

Ao comparar valores de coluna para determinar linhas DISTINTAS, dois valores NULL são considerados iguais.

EXCEPT e INTERSECT retornam os nomes de coluna do conjunto de resultados que são os mesmos que os nomes de coluna que a consulta no lado esquerdo do operador retorna.

Os nomes de coluna ou aliases nas cláusulas ORDER BY devem fazer referência aos nomes de coluna retornados pela consulta do lado esquerdo.

A anulabilidade de qualquer coluna no conjunto de resultados retornado por EXCEPT ou INTERSECT é a mesma que a anulabilidade da coluna correspondente que é retornada pela consulta no lado esquerdo do operador.

Se EXCEPT ou INTERSECT for usado em conjunto com outros operadores em uma expressão, ele será avaliado no contexto da seguinte precedência:

  1. Expressões entre parênteses

  2. O operador INTERSECT

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

Você pode usar EXCEPT ou INTERSECT para comparar mais de dois conjuntos de consultas. Quando você faz isso, a conversão de tipo de dados é determinada comparando duas consultas ao mesmo tempo e seguindo as regras mencionadas anteriormente de avaliação de expressão.

EXCEPT e INTERSECT não podem ser usados em definições de exibição particionadas distribuídas, notificações de consulta.

EXCEPT e INTERSECT podem ser usados em consultas distribuídas, mas são executados apenas no servidor local e não enviados para o servidor vinculado. Como tal, usar EXCEPT e INTERSECT em consultas distribuídas pode afetar o desempenho.

Você pode usar cursores estáticos e somente de avanço rápido no conjunto de resultados quando eles são usados com uma operação EXCEPT ou INTERSECT. Você também pode usar um cursor dinâmico ou controlado por conjunto de teclas juntamente com uma operação EXCEPT ou INTERSECT. Quando o fizer, o cursor do conjunto de resultados da operação é convertido num cursor estático.

Quando uma operação EXCEPT é exibida usando o recurso Gráfico Showplan no SQL Server Management Studio, a operação aparece como uma associação antisemi esquerda e uma operação INTERSECT aparece como uma semijunção esquerda.

Examples

Os exemplos a seguir mostram o uso dos INTERSECT operadores e EXCEPT . A primeira consulta retorna todos os Production.Product valores da tabela para comparação com os resultados com INTERSECT e EXCEPT.

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

A consulta a seguir retorna quaisquer valores distintos que são retornados pela consulta nos lados esquerdo e direito do INTERSECT operador.

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

A consulta a seguir retorna quaisquer valores distintos da consulta à esquerda do EXCEPT operador que também não são encontrados na consulta direita.

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

A consulta a seguir retorna quaisquer valores distintos da consulta à esquerda do EXCEPT operador que também não são encontrados na consulta direita. As tabelas são invertidas em relação ao exemplo anterior.

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

Exemplos: Azure Synapse Analytics and Analytics Platform System (PDW)

Os exemplos a seguir mostram como usar os INTERSECT operadores e EXCEPT . A primeira consulta retorna todos os FactInternetSales valores da tabela para comparação com os resultados com INTERSECT e EXCEPT.

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

A consulta a seguir retorna quaisquer valores distintos que são retornados pela consulta nos lados esquerdo e direito do INTERSECT operador.

-- 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.)  

A consulta a seguir retorna quaisquer valores distintos da consulta à esquerda do EXCEPT operador que também não são encontrados na consulta direita.

-- 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.)