В фильтре вы пишете WHERE o.product_id = (SELECT product_id FROM featured_products), а в таблице featured_products несколько строк. Что верно?

AПодзапрос вернёт несколько строк, сравнение через = станет ошибкой; нужно использовать IN или сделать подзапрос скалярным через MAX / MIN
BСравнение через = автоматически возьмёт первый product_id из подзапроса по порядку строк, поэтому фильтр всё равно отработает без ошибок
CНужно заменить = на LIKE: оператор LIKE умеет работать с несколькими строками подзапроса и без явного IN подберёт совпадения
DДостаточно добавить DISTINCT в подзапрос: после DISTINCT он гарантированно вернёт ровно одну строку и сравнение через = станет корректным
Правильный ответ. Оператор = ожидает одно значение справа; если подзапрос возвращает набор, используйте IN или агрегируйте до одного значения.

Разбор

Подзапрос в правой части = обязан вернуть ровно одно значение. Если он возвращает несколько строк, большинство СУБД выдаёт ошибку. Если вы хотите проверить принадлежность множеству значений, используйте IN. Если по смыслу нужно именно одно значение, сделайте подзапрос скалярным — например, агрегатом MAX или MIN или явным ограничением результата.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

Ещё вопросы по теме «Подзапросы и CTE»