Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como fazer um LEFT ANTI SEMI JOIN no SQL Server


A LEFT ANTI SEMI JOIN é um tipo de junção que retorna apenas as linhas distintas no conjunto de linhas da esquerda que não têm nenhuma linha correspondente no conjunto de linhas da direita.

Mas ao usar o T-SQL no SQL Server, se você tentar usar explicitamente LEFT ANTI SEMI JOIN em sua consulta, você provavelmente receberá o seguinte erro:
Msg 155, Level 15, State 1, Line 4
'ANTI' is not a recognized join option.

Felizmente, o SQL Server inclui o EXCEPT operador, que nos permite realizar um LEFT ANTI SEMI JOIN .

Quando você usa o EXCEPT operador, ele aparece no plano de execução da consulta como um LEFT ANTI SEMI JOIN .

Você também pode construir uma subconsulta que faça a mesma coisa.

Exemplo


Imagine que temos duas tabelas; Cats e Dogs , e então executamos a seguinte consulta:
SELECT 
    CatName AS PetName
FROM Cats
EXCEPT
SELECT 
    DogName AS PetName
FROM Dogs;

Esta consulta usa o EXCEPT operador, e aparecerá como um LEFT ANTI SEMI JOIN no plano de execução.

É semelhante a fazer o seguinte:
SELECT 
    DISTINCT CatName
FROM Cats c 
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Aqui está o plano de execução para essa consulta:

Se você usa U-SQL com Azure Data Lake Analytics, pode usar o ANTISEMIJOIN cláusula para fazer anti semijunções à direita e à esquerda. Ou seja, você pode usar LEFT ANTISEMIJOIN ou RIGHT ANTISEMIJOIN .