Używam MySQL. Oto mój schemat:
Dostawcy ( sid: integer , sname: string, adres string)
Części ( pid: integer , pname: string, color: string)
Katalog ( sid: integer, pid: integer , cost: real)
(klucze główne są pogrubione)
Próbuję napisać zapytanie, aby wybrać wszystkie części, które są wykonane przez co najmniej dwóch dostawców:
-- 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
);
Po pierwsze, czy w ogóle podchodzę do tego we właściwy sposób?
Po drugie otrzymuję ten błąd:
1111 - Nieprawidłowe użycie funkcji grupy
Co ja robię źle?
źródło
Po pierwsze, błąd, który otrzymujesz, wynika z tego, gdzie używasz
COUNT
funkcji - nie możesz użyć funkcji agregującej (lub grupy) wWHERE
klauzuli.Po drugie, zamiast używać podzapytania, po prostu połącz tabelę ze sobą:
Co moim zdaniem powinno zwrócić tylko wiersze, w których istnieją co najmniej dwa wiersze z tym samym,
pid
ale są co najmniej 2sid
s. Aby upewnić się, że otrzymasz tylko jeden wiersz na każdypid
, zastosowałem klauzulę grupowania.źródło
COUNT(DISTINCT sid)
w zaktualizowanym zapytaniu.sid
zawsze muszą być różne w każdym razie, bosid
ipid
razem tworzą klucz podstawowy dlaCatalog
?