Разликата е, че когато използвате exists
- заявката вътре обикновено зависи от основната заявка (означава, че използва колони от нея и затова не може да бъде изпълнена отделно) и така за всеки ред от основната заявка проверява дали някои данни, извлечени от подзаявката, съществуват или не.
Проблемът с първата ви заявка е, че подзаявката вътре в съществуващия блок по никакъв начин не зависи от основните колони на заявката, това е отделна заявка, която винаги връща ред с 1
, така че за всеки ред от основната заявка резултатът от exists
винаги ще бъде true
. Така че първата ви заявка е просто еквивалентна на
SELECT distinct(company_id)
FROM user
WHERE user.user_id = 123
AND user.company_id IS NOT NULL
Вижте също цигулка