Безуспешная попытка объединить два разных запроса

#sql

#sql

Вопрос:

Я безуспешно пытался «объединить» два запроса, чтобы получить дату последнего обновления продукта с последней ценой.

Взгляните на это:

У меня есть 2 разные таблицы: products_table и products_prices

В таблице products_table у меня есть все разные продукты, и каждый раз, когда изменяется атрибут, поле last_update_date также изменяется.

Если я хочу получить последнее обновление продукта, я использую этот запрос:

 select a.item,a.last_update_date from products_table a inner join
(Select item, max(last_update_date) updates from products_table
group by item) b
on a.item=b.item --item is the product_id
and a.last_update_date=b.updates
  

Кроме того, у меня есть таблица products_prices, которая содержит все разные цены на продукты, и если я хочу получить последнюю цену продукта, я использую этот запрос (фильтрация по request_id):

 select * from products_prices a
where item_code = ''--Product_id
and request_id = (select max(request_id) from products_prices b where a.item_code=b.item_code);
  

Проблема в том, что я не знаю, как объединить эти 2 запроса, чтобы получить последнее обновление продукта и последнюю цену в одной строке

Не могли бы вы мне помочь?

Ответ №1:

 Select first_query.last_update_date, second_query.latest_price -- or whatever name it is
from
(select a.item, a.last_update_date from products_table a inner join
 (Select item, max(last_update_date) updates from products_table
 group by item) b
 on a.item=b.item --item is the product_id
 and a.last_update_date=b.updates) first_query, 
(select * from products_prices a
where item_code = ''--Product_id
and request_id = (select max(request_id) from products_prices b where a.item_code=b.item_code)) second_query
where
first_query.item = second_query.item_code;
  

Ответ №2:

Это было бы проще с помощью оконных функций:

 select p.item, p.last_update_date, pp.*
from (select p.*,
             row_number() over (partition by p.item order by p.last_update_date desc) as seqnum
      from products_table p 
     ) p join
     (select pp.*,
             row_number() over (partition by pp.item_code order by pp.request_id desc) as seqnum
      from pp p 
     ) pp
     on pp.item_code = p.item
where p.seqnum = 1 and pp.seqnum = 1;