Присоединиться к левой стороне MAX(DATE)

У меня есть 2 таблицы: Транзакции (а) и Цены (б). Я хочу получить цену из таблицы b, которая действительна на дату транзакции.

Таблица а содержит историю транзакций товаров: Store_type, Date, Article, ...

Таблица b содержит историю цен на товары: Store_type, Date, Article, price.

В настоящее время у меня есть это:

Select
a.Store_type,
a.Date
a.Article,
(select b.price
  from PRICES b
  where b.Store_type = a.Store_type
  and b.Article = a.Article
  and b.Date = (select max(c.date)
    from PRICES c
    where c.Store_type = a.Store_type
    and c.Article = a.Article
    and c.date <= a.date)) AS ART_PRICE
from TRANSACTIONS a

Это работает просто отлично, но кажется, что это занимает очень много времени из-за двойного подзапроса. Можно ли сделать то же самое с помощью LEFT JOIN?


person Niels Perfors    schedule 28.08.2015    source источник
comment
Не рекомендуется иметь поле с именем Date, потому что это слово уже используется в sql.   -  person Hearner    schedule 28.08.2015
comment
Это пример... В базе данных нет поля с именем дата.   -  person Niels Perfors    schedule 28.08.2015
comment
покажите имеющиеся у вас индексы с show create table xxx для каждой таблицы. Упс, это показало бы настоящие имена столбцов, извините.   -  person Drew    schedule 28.08.2015


Ответы (1)


Можно попробовать использовать приведенный ниже запрос?

SELECT      a.Store_type, a.Date, a.Article, b.Price
FROM        TRANSACTIONS a
LEFT JOIN   PRICES b ON a.Store_type = b.Store_type
AND         a.Article = b.Article
AND         b.Date = (SELECT   MAX (c.Date) 
                      FROM     PRICES c 
                      WHERE    a.Store_type = c.Store_Type
                      AND      a.Article = c.Article
                      AND      c.Date <= a.Date)

Однако у него все еще есть один подзапрос, используемый для получения максимальной даты.

person rcs    schedule 28.08.2015