2017-12-05 4 views
1

Lets Angenommen, wir habenSQL-Abfrage, die alle Datensätze bringt, die nicht mit einem bestimmten Wert eine Verknüpfung nicht enthält

Owners 
id 

Dogs 
id 
owner_id 
trained (boolean) 

Ich möchte alle Besitzer erhalten, die nichtjede ausgebildeten Hund haben, einschließlich derer, die keinen Hund haben.

Wenn also ein Besitzer einen trainierten Hund hat und ein Hund nicht trainiert, sollte dieser Besitzer nicht erscheinen, weil er bereits einen ausgebildeten Hund hat.

Ich habe versucht, mit so etwas wie folgt aus:

SELECT * FROM owners o 
LEFT JOIN dogs d on d.owner_id = o.id 
WHERE 
    d.trained = false OR d.trained IS NULL. 

Aber diese Abfrage gibt Datensätze einschließlich Besitzer die Hunde ausgebildet, solange sie einen nicht ausgebildeten Hund haben.

I wan't nur erhalten:

  • Eigentümer, die einen einzigen ausgebildeten Hund nicht
  • Besitzer haben, die keine Hunde.

Antwort

1

Der not exists Operator tut genau das:

SELECT * 
FROM owners o 
WHERE NOT EXISTS (SELECT * 
        FORM dogs d 
        WHERE trained = true AND d.owner_id = o.id) 
0
SELECT * 
FROM Owners o,Dogs d 
WHERE o.id=d.owner_id 
and d.trained=false; 
+0

Das Problem bei dieser Abfrage das heißt, wenn der Eigentümer 2 Hunde hat, eine ausgebildete und das andere nicht trainiert, wird es filtern, um nur die nicht trainiert. Und der Besitzer wird falsch in die Ergebnismenge geraten. Die Idee ist, dass wenn der Besitzer einen ausgebildeten Hund hat, sollte es nicht erscheinen. –

+0

Willkommen bei Stack Overflow! Während dieses Code-Snippet die Frage lösen kann, hilft [einschließlich einer Erklärung] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erläuternden Kommentaren zu überladen, da dies die Lesbarkeit sowohl des Codes als auch der Erklärungen verringert! – FrankerZ

Verwandte Themen