Cómo obtener las filas de una tabla que no están en otra tabla en SQL Server

Si estas escribiendo una consulta en SQL y quieres verificar que las filas que te regrese el query no existan en otra tabla, este articulo te servirá.


La base de datos que estoy usando es AdventureWork y es gratuita la puedes descargar aquí, en la consulta quiero encontrar todas las provincias que no tienen direcciones asignadas. Las tablas involucradas son:

  1. En Person.StateProvince, el campo StateProvinceId identifica de manera única a una provincia.
  2. En Person.Address, hay un campo StateProvinceId que enlaza la dirección con la Provincia.

Temas relacionados:

Una forma rápida de hacer la consulta SQL es:

SELECT s.*
  FROM Person.StateProvince s
  WHERE NOT EXISTS (SELECT * FROM Person.Address a 
WHERE s.StateProvinceId = a.StateProvinceId );

Esta consulta funciona bien, puede pensar que SQL Server ejecutará esa consulta SELECT * FROM Person.Address para cada fila de la tabla Person.StateProvince, pero es mucho más inteligente que eso, lo que lo hace más rápido. Escanea primero el índice Person.Address porque es mucho más grande y luego lo une a la tabla Person.StateProvince

Pero hay otra forma de escribir esa misma consulta:

SELECT s.*
  FROM Person.StateProvince s
  LEFT OUTER JOIN Person.Address a ON a.StateProvinceId = s.StateProvinceId
  WHERE a.AddressID IS NULL;

Esta consulta puede ser más difícil de entender la primera vez que la ves. Estoy uniendo a la tabla Person.Address, pero es una combinación opcional, y solo estoy quitando las filas donde la clave principal Person.Address (AddressID) es nulo. Eso significa, solo me regresara las filas de Person.StateProvince sin filas de Person.Address coincidentes.

  1. La tabla Person.StateProvince se procesa primero
  2. Hay un tipo diferente de unirse (todo lo de la izquierda)
  3. Hay un filtro después de la unión

La opción que utilices para realizar la consulta va a ser la manera más intuitiva y legible para ti y tus compañeros de trabajo. Si puedes entender lo que está pasando fácilmente, entonces el motor de SQL también lo hará.

¿Qué opción elegiste? envíame tus comentarios y sugerencias en el apartado de comentarios y en seguida te responderé. Saludos y comparte el articulo en tus redes sociales.

Artículos relacionados
0 Comentarios
Enviame un comentario