Estoy usando MySQL. Aquí está mi esquema:
Proveedores ( sid: integer , sname: string, address string)
Partes ( pid: integer , pname: string, color: string)
Catálogo ( sid: integer, pid: integer , cost: real)
(las claves principales están en negrita)
Estoy tratando de escribir una consulta para seleccionar todas las piezas fabricadas por al menos dos proveedores:
-- 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
);
En primer lugar, ¿estoy haciendo esto de la manera correcta?
En segundo lugar, obtengo este error:
1111 - Uso no válido de la función de grupo
¿Qué estoy haciendo mal?
fuente
Primero, el error que está obteniendo se debe a dónde está usando la
COUNT
función; no puede usar una función agregada (o de grupo) en laWHERE
cláusula.En segundo lugar, en lugar de utilizar una subconsulta, simplemente une la tabla a sí misma:
Lo que creo que debería devolver solo filas donde existen al menos dos filas con lo mismo
pid
pero hay al menos 2sid
s. Para asegurarse de que obtenga solo una fila porpid
, he aplicado una cláusula de agrupación.fuente
COUNT(DISTINCT sid)
en su consulta actualizada.sid
siempre tendría que ser distinto de todos modos, porquesid
ypid
juntos forman una clave primaria paraCatalog
?