Я думаю, что вы хотите:
SELECT p.product_name, c.category_name, p.list_price
FROM products p
INNER JOIN categories c ON p.category_id = c.category_id
WHERE p.list_price > (
SELECT AVG(p1.list_price) FROM products p1 WHERE on p1.category_id = p.category_id
)
Коррелированный подзапрос дает вам среднюю цену всех продуктов в той же категории. Это возвращает скалярное значение, поэтому нет необходимости в операторе на основе набора, таком как ALL
или ANY
.
Также обратите внимание, что ваш исходный запрос имел конфликтующие псевдонимы таблицы между тогда подзапросом и внешним запросом (p
и c
использовались в обоих контекстах), которые создавали неоднозначность относительно того, к какой таблице относились псевдонимы в подзапросе.
Наконец: если вы выполняете MySQL 8.0 (или версия SQLite, которая поддерживает оконные функции), вы можете получить тот же результат со средним значением окна:
SELECT product_name, category_name, list_price
FROM (
SELECT
p.product_name,
c.category_name,
p.list_price,
AVG(list_price) OVER(PARTITION BY c.category_id) avg_list_price
FROM products p
INNER JOIN categories c ON p.category_id = c.category_id
) t
WHERE list_price > avg_list_price