Archive for the ‘SQL’ Category

h1

[SQL]Select tabla registros no estan en otra tabla

julio 21, 2010

Nunca hay una manera única de hacer las cosas y en el caso de las bases de datos,  lo mejor que podemos hacer es probar y analizar nuestras selects para optimizarlas.

De todas manera vamos con el tema del post:

Seleccionar registros de una tabla que no están en otra tabla:

Supongamos t1 = Tabla Origen, t2 = Tabla donde están los registros que no queremos. Trabajaremos con el campo id pero lo podéis substituir por la clave o claves de vuestras tablas

1) Select * from t1 where not exists (select 1 from t2 where t2.id = t1.id)

Si el campo/s id esta indexado esto va a ser muy rápido y sin problemas. Es posible que inicialmente hayais pensado en un NOT IN al estilo:

2) Select * from t1 where t1.id not in (select t2.id from t2)

Esta segunda opción es altamente ineficiente pues a cada registro se ejecuta la segunda select y la búsqueda en su resultado. Si t2 es grande lo vais a notar mucho.

Podríamos hacer un left join de manera que seleccionamos los que no ha podido hacer el join:

3) Select * from t1 left join t2 on t1.id=t2.id where t2.id is null;

Por algún motivo esta opcion se me antoja fea y prefiero la 1. Aún así puede ser muy ágil, por lo que vale la pena investigar la eficiencia de cada opción y escoger la que más nos complazca.

Hasta pronto!