Um alle Benutzer mit mindestens einem Beitrag mit einer Bewertung über 10 zu finden, verwenden Sie:
SELECT u.*
FROM USERS u
WHERE EXISTS(SELECT NULL
FROM POSTS p
WHERE p.user_id = u.id
AND p.rating > 10)
VORHANDEN nicht über die SELECT-Anweisung nicht kümmern innerhalb es - Sie könnten NULL durch 1/0 ersetzen, was zu einem mathematischen Fehler beim Teilen durch Null führen sollte ... Aber es wird nicht, weil EXISTS nur die Filterung in der WHERE-Klausel betrifft.
Die Korrelation (die WHERE p.user_id = u.id) ist der Grund, warum dies als korrelierte Unterabfrage bezeichnet wird und nur Zeilen aus der USERS-Tabelle zurückgegeben werden, in denen die ID-Werte übereinstimmen, zusätzlich zum Bewertungsvergleich.
EXISTS ist auch schneller, abhängig von der Situation, weil es wahr zurückgibt, sobald die Kriterien erfüllt sind - Duplikate spielen keine Rolle.
Können Sie mir das erklären. Die innere Abfrage erhält eine beliebige Anzahl von NULL-Zeilen. Dann EXISTS kocht es auf wahr oder falsch, so wird es nicht nur alle Benutzer oder keine? – ash
@Jasie: EXISTS kümmert sich nicht um die SELECT-Anweisung darin - Sie könnten NULL durch 1/0 ersetzen, was zu einem mathematischen Fehler beim Teilen durch Null führen sollte ... Aber es wird nicht, weil EXISTS nur betroffen ist mit der Filterung in der WHERE-Klausel. Die Korrelation (die 'WHERE p.user_id = u.id') ist der Grund, warum dies als korrelierte Unterabfrage bezeichnet wird und nur Zeilen aus der USERS-Tabelle zurückgibt, in der die ID-Werte übereinstimmen, zusätzlich zum Bewertungsvergleich. –
@Jasie: EXISTS ist auch schneller, abhängig von der Situation, weil es wahr zurückgibt, sobald die Kriterien erfüllt sind - Duplikate spielen keine Rolle. –