@belyaevcyrill

Как правильно написать SQL-запрос?

Есть SQL-запрос:

select *
from products_orders po
left join products p
    on p.id = po.product_id
where
    po.region_id in (1,2,3,4) and
    po.product_id = 100


Суть запроса — выбираем все записи из таблицы products_orders, у которых код региона в диапазоне (1,2,3,4) и ID продукта равен 100. Очевидно, что таблица products_orders — это таблица, которая связывает таблицы orders и products. Иными словами, поля order_id и product_id у таблицы products_orders не уникальные (значения могут повторяться).

В результате запроса получаем таблицу, примерно нечто вроде этого:
01fc04f73ccd43bebc348c2991f37009.png

Но возникла необходимость, чтобы в получаемой таблице были ещё и те записи, регионы которых (region_id) не в диапазоне (1,2,3,4). Скажем, есть ещё регионы с кодами 5, 6 и 7. Надо, чтобы в результирующей таблице были просто их ИД-шники. Т.е., должно быть именно так, как на картинке ниже:
54fe675324ac47bdbd94820e32b6e099.png

Возможно ли сделать такой запрос без под-селектов? Только на джойнах?
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 1
denman1985
@denman1985
SQL, Oracle Forms/Reports dbd
Как я понял, надо чтобы не нужные region_id были по 1му разу (учитывая что заказы на них были) и со всеми полями NULL кроме product_id и region_id.
По заданному условию вижу следующие варианты:
1. Оставлять запрос как есть и добавлять в конце 3хUNION select 100, NULL, NULL, NULL, 5 (6) (7)

2. Менять запрос на:
select distinct po.product_id, 
(case when po.region_id in (1,2,3,4) then order_id else null end) as order_id,
(case when po.region_id in (1,2,3,4) then p.product_name else null end) as product_name,
(case when po.region_id in (1,2,3,4) then po.order_date else null end) as order_date,
region_id
from products_orders po
left join products p
    on p.id = po.product_id
where
    po.product_id = 100
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы