mysql - right - ¿Cuál es la mejor manera de utilizar LEFT OUTER JOIN para verificar la inexistencia de filas relacionadas?
outer join mysql (5)
Usando MySQL 5.x, quiero seleccionar de manera eficiente todas las filas de la tabla X donde no hay ninguna fila relacionada en la tabla Y que satisfaga alguna condición, por ejemplo
Dame todos los registros en X donde NO existe una Y relacionada con foo = bar
SELECT count(id) FROM X
LEFT OUTER JOIN Y ON y.X_id = X.id AND y.foo = ''bar''
WHERE y....?
Tal como lo entiendo, se garantiza que una unión externa izquierda producirá una fila para cada fila en la tabla izquierda (primera) - X en este caso - si se encontró o no una fila satisfactoria en la tabla unida. Lo que quiero hacer es seleccionar solo aquellas filas donde no se encontró ninguna fila.
Me parece que y.X_id debería ser NULL si no hay un registro coincidente, pero esta prueba no parece funcionar. Tampoco lo hace y.X_id = 0 o! Y.X_id.
Ediciones : error de transcripción corregido (ON no AS) que fue señalado por varias respuestas. Se arregló el error gramatical.
¿Por qué usar una unión externa? ¿No podrías hacer lo siguiente?
SELECT count(id)
FROM X JOIN Y AS y.X_id = X.id AND y.foo <> ''bar''
Comprobar si la clave primaria de la tabla Y es NULL haría el truco, lo que indica que la unión no coincidía:
SELECT count(id) FROM X
LEFT OUTER JOIN Y ON (y.X_id = X.id AND y.foo = ''bar'')
WHERE y.Y_id is null
La respuesta de Johan es correcta al 100%.
Además de eso, también hay esta opción:
SELECT count(id)
FROM X
WHERE NOT EXISTS
( SELECT *
FROM Y
WHERE (y.X_id = X.id AND y.foo = ''bar'')
)
Dependiendo del tamaño de su mesa y la distribución de datos, esto puede ser más eficiente. Pruebe y mantenga ambas formas para referencia futura.
SELECT count(id) FROM X
LEFT OUTER JOIN Y ON (y.X_id = X.id AND y.foo = ''bar'')
WHERE y.X_id is null
Tu estabas cerca.
Primero, realice la unión como siempre, luego seleccione todas las filas para las cuales una línea que not null
en Y sea en realidad null
, por lo que está seguro de que hay un "no coincidencia" y no solo un valor null
en Y.
También tenga en cuenta el error tipográfico que hizo en la consulta:
LEFT OUTER JOIN Y AS
-- should be
LEFT OUTER JOIN Y ON
-- This however is allowed
LEFT OUTER JOIN table2 as Y ON ....
¡Tienes que recordar que NULL tiene un valor especial! Y es por eso que tengo un documento de mysql. Tiene un capítulo llamado "4.3.4.6 Trabajar con valores NULL" .
enlace: https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html
¡disfrutar!