Ich benutze MySQL. Hier ist mein Schema:
Lieferanten ( sid: integer , sname: string, address string)
Teile ( pid: integer , pname: string, color: string)
Katalog ( sid: integer, pid: integer , cost: real)
(Primärschlüssel sind fett gedruckt)
Ich versuche, eine Abfrage zu schreiben, um alle Teile auszuwählen, die von mindestens zwei Lieferanten hergestellt werden:
-- Find the pids of parts supplied by at least two different suppliers.
SELECT c1.pid -- select the pid
FROM Catalog AS c1 -- from the Catalog table
WHERE c1.pid IN ( -- where that pid is in the set:
SELECT c2.pid -- of pids
FROM Catalog AS c2 -- from catalog
WHERE c2.pid = c1.pid AND COUNT(c2.sid) >= 2 -- where there are at least two corresponding sids
);
Zunächst einmal, mache ich das überhaupt richtig?
Zweitens erhalte ich diesen Fehler:
1111 - Ungültige Verwendung der Gruppenfunktion
Was mache ich falsch?
quelle
Erstens ist der Fehler darauf zurückzuführen, wo Sie die
COUNT
Funktion verwenden - Sie können keine Aggregat- (oder Gruppen-) Funktion in derWHERE
Klausel verwenden.Zweitens, anstatt eine Unterabfrage zu verwenden, verbinden Sie einfach die Tabelle mit sich selbst:
Was meiner Meinung nach nur Zeilen zurückgeben sollte, in denen mindestens zwei Zeilen mit derselben existieren,
pid
aber mindestens 2sid
s vorhanden sind. Um sicherzustellen, dass Sie nur eine Zeile pro Zeile zurückerhalten,pid
habe ich eine Gruppierungsklausel angewendet.quelle
COUNT(DISTINCT sid)
in Ihrer aktualisierten Abfrage verwenden.sid
sowieso nicht immer verschieden sein, weilsid
undpid
zusammen einen Primärschlüssel für bildenCatalog
?