Esto parece tan básico, estoy estupefacto por la falta de una palabra mejor. Tengo dos tablas, llamémosles albums
y artists
nulo e IN() proporciona resultados inesperados
CREATE TABLE `albums` (
`album_id` bigint(20) NOT NULL AUTO_INCREMENT,
`artist_id` bigint(20) DEFAULT NULL,
`name` varchar(200) NOT NULL,
PRIMARY KEY (`album_id`)
)
CREATE TABLE `artists` (
`artist_id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(250) NOT NULL,
PRIMARY KEY (`artist_id`)
)
Hay unos cientos de miles reconds en cada mesa. Algunas de las filas del álbum tienen un nulo artist_id
, esto es esperado.
Sin embargo, cuando realizo la siguiente consulta para encontrar artistas sin álbumes:
SELECT * FROM artists WHERE artist_id NOT IN (SELECT artist_id FROM albums)
... La consulta devuelve cero resultados. Sé que esto no es verdad. Así que traté de éste:
SELECT * FROM artists WHERE artist_id NOT IN (SELECT artist_id FROM albums WHERE artist_id IS NOT NULL)
... y regrese un par de miles de filas. Mi pregunta es: ¿por qué la primera consulta parece operar con la idea de que cualquier número = NULL? ¿O es este un efecto extraño que NULL tiene en la declaración IN()
? Siento que esto es algo básico que me he perdido. Normalmente no uso NULL en mis tablas de db.
Parece que NOT EXISTS fue marginalmente más rápido, también. ¡Muchas gracias por la información! –