Estou usando o MySQL. Aqui está meu esquema:
Fornecedores ( sid: inteiro , sname: string, string de endereço)
Partes ( pid: inteiro , pname: string, cor: string)
Catálogo ( sid: inteiro, pid: inteiro , custo: real)
(as chaves primárias estão em negrito)
Estou tentando escrever uma consulta para selecionar todas as peças feitas por pelo menos dois fornecedores:
-- 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
);
Em primeiro lugar, estou mesmo fazendo isso da maneira certa?
Em segundo lugar, recebo este erro:
1111 - Uso inválido de função de grupo
O que estou fazendo de errado?
fonte
Primeiro, o erro que você está obtendo é devido ao local em que você está usando a
COUNT
função - você não pode usar uma função de agregação (ou grupo) naWHERE
cláusula.Em segundo lugar, em vez de usar uma subconsulta, simplesmente junte a tabela a ela mesma:
O que eu acredito que deva retornar apenas linhas onde existem pelo menos duas linhas com o mesmo,
pid
mas há pelo menos 2sid
s. Para ter certeza de que você receberá de volta apenas uma linha,pid
apliquei uma cláusula de agrupamento.fonte
COUNT(DISTINCT sid)
em sua consulta atualizada.sid
sempre teria que ser distinto de qualquer maneira, porquesid
epid
juntos formam uma chave primária paraCatalog
?