Der Unterschied besteht darin, dass bei Verwendung von exists
- Die darin enthaltene Abfrage hängt normalerweise von der Hauptabfrage ab (Mittelwert verwendet Spalten davon und kann daher nicht separat ausgeführt werden) und überprüft daher für jede Zeile der Hauptabfrage, ob einige Daten, die von der Unterabfrage abgerufen wurden, vorhanden sind oder nicht.
Das Problem Ihrer ersten Abfrage besteht darin, dass die Unterabfrage innerhalb des Existiert-Blocks sowieso nicht von den Hauptabfragespalten abhängt, sondern eine separate Abfrage ist, die immer eine Zeile mit 1
zurückgibt , also für jede Zeile der Hauptabfrage das Ergebnis von exists
wird immer true
sein . Ihre erste Abfrage entspricht also nur
SELECT distinct(company_id)
FROM user
WHERE user.user_id = 123
AND user.company_id IS NOT NULL
Siehe auch Geige