La diferencia es que cuando usas exists
- la consulta interna generalmente depende de la consulta principal (es decir, usa columnas de ella y, por lo tanto, no se puede ejecutar por separado) y, por lo tanto, para cada fila de la consulta principal, verifica si existen o no algunos datos recuperados por la subconsulta. /P>
El problema de su primera consulta es que la subconsulta dentro del bloque existe no depende de las columnas de la consulta principal, es una consulta separada que siempre devuelve una fila con 1
, entonces, para cualquier fila de la consulta principal, el resultado de exists
será siempre true
. Entonces, su primera consulta es equivalente a
SELECT distinct(company_id)
FROM user
WHERE user.user_id = 123
AND user.company_id IS NOT NULL
Ver también fiddle