Я использую MySQL. Вот моя схема:
Поставщики ( sid: целое число , sname: строка, адресная строка)
Части ( pid: целое число , pname: строка, цвет: строка)
Каталог ( sid: integer, pid: integer , cost: real)
(первичные ключи выделены жирным шрифтом)
Я пытаюсь написать запрос, чтобы выбрать все детали, изготовленные как минимум двумя поставщиками:
-- 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
);
Во-первых, правильно ли я поступаю?
Во-вторых, я получаю такую ошибку:
1111 - Недопустимое использование групповой функции
Что я делаю не так?
источник
Во-первых, ошибка, которую вы получаете, связана с тем, где вы используете
COUNT
функцию - вы не можете использовать агрегатную (или групповую) функцию вWHERE
предложении.Во-вторых, вместо использования подзапроса просто присоедините таблицу к самой себе:
Который, я считаю, должен возвращать только строки, в которых существует не менее двух строк с одинаковыми,
pid
но есть не менее 2sid
с. Чтобы убедиться, что вы вернетесь только к одной строке,pid
я применил предложение группировки.источник
COUNT(DISTINCT sid)
в своем обновленном запросе.sid
любом случае не всегда нужно было бы отличаться, потому чтоsid
иpid
вместе образуют первичный ключ дляCatalog
?