una tablas tabla registros que otra inner estan datos consultar concatenar comparar coincidentes buscar sql oracle exists anti-join

sql - tablas - Comprobando si un artículo no existe en otra tabla



consultar dos tablas sql (4)

Mis mesas están configuradas algo como esto:

table name: process fields: name, id_string table name: value_seach fields: id_string, value

Quiero construir una declaración de selección que muestre todos los nombres de proceso (con su id_string respectivo) que no tienen una entrada en value_search.

La id_string en la tabla de proceso puede ser nula y aún tener un nombre, pero es necesario excluirlos si es posible. El id_string en value_search nunca puede ser nulo

¿Cómo hago esto?


Creo que usar Not Exists sería tu mejor opción aquí.

SELECT p.name, p.id_string FROM process p WHERE NOT p.id_string IS NULL AND NOT EXISTS( SELECT NULL FROM value_search v WHERE p.id_string = v.id_string)


En general, si desea filas que no existen en otra tabla, LEFT JOIN se une a la otra tabla y DONDE ... ES NULO a una columna en la segunda tabla. También mencionaste que no quieres filas donde process.id_string es NULL.

SELECT p.name, p.id_string FROM process p LEFT JOIN value_search v ON v.id_string = p.id_string WHERE v.id_string IS NULL AND p.id_string IS NOT NULL

Esto se conoce como un anti-join.


La consulta que desea debe verse algo como esto. Tenga en cuenta que un JOIN será significativamente más rápido que una subconsulta en la cláusula WHERE.

SELECT p.name, p.id_string FROM process p LEFT OUTER JOIN value_search v ON p.id_string = v.id_string AND p.id_string IS NOT NULL AND v.id_string IS NULL

Una variante igualmente válida de la consulta anterior sería:

SELECT p.name, p.id_string FROM process p LEFT OUTER JOIN value_search v ON p.id_string = v.id_string WHERE p.id_string IS NOT NULL AND v.id_string IS NULL


SELECT name, id_string FROM process WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach