Różnica polega na tym, że gdy używasz exists
- zapytanie wewnątrz zwykle zależy od głównego zapytania (tzn. używa kolumn z niego, więc nie może być wykonane osobno), a więc dla każdego wiersza głównego zapytania sprawdza, czy jakieś dane pobrane przez podzapytanie istnieją, czy nie.
Problem z pierwszym zapytaniem polega na tym, że podzapytanie w bloku istnieje nie zależy w żaden sposób od głównych kolumn zapytania, jest to oddzielne zapytanie, które zawsze zwraca wiersz z 1
, więc dla dowolnego wiersza głównego zapytania wynik exists
zawsze będzie true
. Tak więc pierwsze zapytanie jest po prostu równoważne z
SELECT distinct(company_id)
FROM user
WHERE user.user_id = 123
AND user.company_id IS NOT NULL
Zobacz też skrzypce