Pregunta

Mis tablas están configuradas algo como esto:

table name: process
fields: name, id_string

table name: value_seach
fields: id_string, value

Quiero construir una instrucción SELECT que muestre todos los nombres de procesos (con sus respectivos ID_String) que no tienen una entrada en Value_Search.

El ID_String en la tabla de procesos puede ser nulo, y todavía tienen un nombre, pero esos deben ser excluidos si es posible. El id_string en value_search nunca puede ser nulo

¿Cómo hago esto?

¿Fue útil?

Solución

En general, si desea filas que no existen en otra tabla, luego se deje unirse a la otra tabla y donde ... está nulo a una columna en la segunda tabla. También mencionó que no desea filas donde procese.id_string es nulo.

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-unión.

Otros consejos

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)

La consulta que desee debe verse algo así. Tenga en cuenta que una unión será significativamente más rápida 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top