В фильтре вы пишете 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 или явным ограничением результата.

Проверь себя · 1/3разбор после ответа
В одном отчёте вы считаете несколько метрик по событиям: dau, wau и число покупок. У всех метрик один и тот же фильтр: только продакшн-трафик и только выбранный период. Какой подход лучше защищает от ситуации, когда в одной метрике забыли часть фильтра?
Тренировать SQL в Telegram

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