A diferença é que quando você usa
exists
- a consulta interna geralmente depende da consulta principal (a média usa colunas dela e, portanto, não pode ser executada separadamente) e, portanto, para cada linha da consulta principal ele verifica se algum dado recuperado pela subconsulta existe ou não. O problema da sua primeira consulta é que a subconsulta dentro do bloco existe não depende das colunas da consulta principal, é uma consulta separada que sempre retorna uma linha com
1
, portanto, para qualquer linha da consulta principal, o resultado de exists
será sempre true
. Então, sua primeira consulta é equivalente a SELECT distinct(company_id)
FROM user
WHERE user.user_id = 123
AND user.company_id IS NOT NULL
Veja também violino