Forskellen er, at når du bruger exists
- forespørgslen inde afhænger normalt af hovedforespørgslen (gennemsnit bruger kolonner fra den og kan derfor ikke udføres separat), og derfor tjekker den for hver række i hovedforespørgslen, om nogle data, der hentes af underforespørgslen, findes eller ej.
Problemet med din første forespørgsel er, at underforespørgslen inde i en eksisterende blok ikke på nogen måde afhænger af hovedforespørgselskolonnerne, det er en separat forespørgsel, som altid returnerer en række med 1
, så resultatet af exists
for enhver række i hovedforespørgslen vil altid være true
. Så din første forespørgsel svarer bare til
SELECT distinct(company_id)
FROM user
WHERE user.user_id = 123
AND user.company_id IS NOT NULL
Se også violin