2011-04-15 18 views
29

Podría alguien proporcionar por favor cómo escribir la siguiente consulta sql usando join. No quiero usar no en y si es posible me gustaría reemplazar donde también está.Cómo escribir la consulta "no en()" sql usando join

SELECT d1.Short_Code 
FROM domain1 d1 
WHERE d1.Short_Code NOT IN (
    SELECT d2.Short_Code 
    FROM Domain2 d2 
) 

estoy usando SQL Server 2008

Respuesta

45

este artículo:

puede haber si su interés.

En un par de palabras, esta consulta:

SELECT d1.short_code 
FROM domain1 d1 
LEFT JOIN 
     domain2 d2 
ON  d2.short_code = d1.short_code 
WHERE d2.short_code IS NULL 

funcionará pero es menos eficiente que un NOT NULL (o NOT EXISTS) construir.

También puede utilizar esto:

SELECT short_code 
FROM domain1 
EXCEPT 
SELECT short_code 
FROM domain2 

Se trata de utilizar ni NOT IN ni WHERE (e incluso sin juntas!), Pero esto va a eliminar todos los duplicados en domain1.short_code si los hay.

+1

@Quassnoi, ¿Podrían presentar la forma de escribir de manera eficiente la misma consulta utilizando ya sea "NO NULO" y/o "NO EXISTE" – Elangesh

+1

@Elan: su búsqueda original es simplemente agradable. Solo crea los índices en 'short_code' en ambas tablas. – Quassnoi

+0

@Quassnoi - Estás asumiendo que no necesita ninguna información de la tabla del dominio2 – Aducci

10
SELECT d1.Short_Code 
FROM domain1 d1 
LEFT JOIN domain2 d2 
ON d1.Short_Code = d2.Short_Code 
WHERE d2.Short_Code IS NULL 
1

Yo optaría por NOT EXISTS en este caso.

SELECT D1.ShortCode 
FROM Domain1 D1 
WHERE NOT EXISTS 
    (SELECT 'X' 
    FROM Domain2 D2 
    WHERE D2.ShortCode = D1.ShortCode 
    ) 
+0

¿Qué diferencia haría 'NOT EXISTS'? – Quassnoi

+0

En lugar de una combinación externa o una operación OR compleja (con la cláusula NOT IN), el optimizador debería usar el equivalente de una combinación de combinación de exclusión entre las dos tablas. –

+2

el optimizador construirá exactamente el mismo plan para 'NOT IN' y' NOT EXISTS' (siempre que 'short_code' no sea nulo). No habrá "operaciones OR complejas". – Quassnoi