2010-06-02 21 views
20

es el siguiente el más eficiente en SQL para lograr su resultado:SQL: ... donde x IN (SELECT Y DE ...)

SELECT * 
    FROM Customers 
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS) 

Podría algún uso de une a ser mejor y lograr el mismo ¿resultado?

Respuesta

6

Una de las razones por las que podría preferir utilizar un JOIN en lugar de NOT IN es que si los valores en la cláusula NOT IN contienen ningún NULL s se quiere always get back no results. Si usa NOT IN, recuerde siempre considerar si la consulta secundaria puede devolver un valor NULO.

RE: Pregunta en Comentarios

'X' NO EN (NULL, 'a', 'b')

≡ 'x' <> NULL y 'x' <> 'una 'y '' <> 'b x'

≡ Desconocido y Verdadero y Verdadero

≡ Desconocido

+0

¿Está diciendo que SELECCIONE 'A' DONDE 'x' NO EN (NULL, 'a', 'b') devuelve un resultado vacío? – CJ7

+2

@Craig - Sí Exactamente. –

2

quizás tratar este

Select cust.* 

From dbo.Customers cust 
Left Join dbo.Subscribers subs on cust.Customer_ID = subs.Customer_ID 
Where subs.Customer_Id Is Null 
9

Cualquier base de datos SQL suficientemente maduro debe ser capaz de ejecutar esa misma eficacia que el equivalente JOIN. Usa lo que sea más legible para ti.

+4

+1 esto es correcto: SQL Server convierte consultas de tipo 'NO EN' y 'NO EXISTE' en el mismo plan de ejecución. – eddiegroves

3
SELECT Customers.* 
    FROM Customers 
WHERE NOT EXISTS (
     SELECT * 
     FROM SUBSCRIBERS AS s 
     JOIN s.Cust_ID = Customers.Customer_ID) 

Cuando se utiliza “NOT IN”, la consulta realiza anidado exploraciones de tabla completo, mientras que por “no existe”, la consulta puede utilizar un índice dentro de la sub-consulta.

+2

Depende de la base de datos: SQL Server generará el mismo plan de ejecución y buscará índices (donde existen índices) – eddiegroves

0

Si desea saber cuál es más efectivo, debe intentar consultar los planes de consulta estimados o los planes de consulta reales después de la ejecución. Le indicará los costos de las consultas (me parece interesante que la CPU y el costo de IO sean interesantes). No me sorprendería mucho si hay poca o ninguna diferencia, pero nunca se sabe. He visto ciertas consultas usar múltiples núcleos en nuestro servidor de base de datos, mientras que una versión reescrita de esa misma consulta solo usaría un núcleo (sin necesidad de decir que la consulta que utilizó los 4 núcleos fue 3 veces más rápida). Nunca me he dado cuenta de por qué, pero si trabajas con grandes conjuntos de resultados, estas diferencias pueden ocurrir sin que lo sepas.