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