2015-08-28 4 views
0

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

Таблица а содержит историю статьи сделок: Store_type, дата, статьи, ...

Таблица б содержит историю цен статьи: Store_type, дата, статьи, цены

В настоящее время я имеют следующее:

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 

Он работает нормально, но, похоже, занимает очень много времени из-за двойного подзапроса. Можно ли это сделать с ЛЕВЫМ ПРИСОЕДИНЕНИЕМ?

+0

Неплохо иметь поле с именем 'Date', потому что это слово уже используется в sql – Hearner

+0

Это пример ... В базе данных нет имени с именем. –

+0

показать индексы, которые у вас есть, с помощью 'show create table xxx' для каждой таблицы. Ooops, что бы показать истинные имена столбцов, извините. – Drew

ответ

0

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

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) 

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

+0

Тинкс, я отдам его. –

Смежные вопросы