7 Stimmen

SQL-Abfrage für etwas wie "nicht haben"?

Ich versuche, eine Abfrage zu schreiben, die zurückgibt, welche Hosts ein Stück Software vermissen:

Host                    Software
A                       Title1
A                       Title2
A                       Title3 
B                       Title1
B                       Title3
C                       Title4
C                       Title3

Wie kann abgefragt werden, bei welchen Hosts Title2 fehlt (sollte B und C sein)? Ich habe es mit GROUP BY, HAVING und einer Unterabfrage mit COUNT versucht, aber ich scheine nicht die richtige Idee zu haben.

19voto

Gordon Linoff Punkte 1198148

Ich denke, eine einfachere Methode wäre, dies zu tun:

select software
from HostSoftware hs
group by software
having max(case when software = 'Title2' then 1 else 0 end) = 0

Dazu ist keine korrelierte Unterabfrage erforderlich. Außerdem sollte dies bei den meisten Datenbanken zu besseren Ausführungsplänen führen.

14voto

Ian Newson Punkte 7037
SELECT Host FROM HostSoftware
WHERE NOT EXISTS (
    SELECT * FROM HostSoftware AS InnerSoftware
    WHERE InnerSoftware.Host = HostSoftware.Host AND InnerSoftware.Software ='Title2'
)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X