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

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

Разбор

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

Проверь себя · 1/3разбор после ответа
Что является практическим преимуществом разбиения сложного запроса на шаги через WITH по сравнению с несколькими вложенными подзапросами?
Тренировать SQL в Telegram

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