2010-07-20 4 views
4

У меня есть запрос sqlite, который я пытаюсь написать. У меня есть две таблицы:Соедините таблицы на ближайшую дату в прошлом, в MySQL

TABLEA (продажи): идентификатор продажи Дата

TableB (цели): идентификатор цель Дата

Я выбор из TableA так: ВЫБРАТЬ id, sales, date FROM TableA

Теперь к «сложной» части. Мне нужно подключить TableB к запросу, потому что мне нужно поле цели в TableB для каждой строки в TableA. ТаблицаB содержит только голы на некоторые даты, а ТаблицаA содержит все даты. Поэтому я не могу просто использовать TableA.date = TableB.date

Вместо этого для каждой строки в таблицеA мне нужно взять цель из TableB в дату, ближайшую в прошлом, к дате в таблицеA. Надеюсь, я смог объяснить, что мне нужно. Невозможно понять, как это сделать.

ответ

9
SELECT a.id, a.sales, a.date, (SELECT TOP 1 Goal 
           FROM TableB b WHERE b.date < a.date 
           ORDER BY b.date DESC) As Goal 
FROM TableA a 

Сходит с ближайшей даты в прошлом.

+0

Это хорошо, но единственная проблема - вам нужно также проверить идентификатор. –

1

«Точно равная дата» будет соединением в поле даты. (Как и в ответе Эша)

«Ближайшая дата» должна, вероятно, читать что-то вроде «ближайшего дате в будущем» или «ближайшей даты в прошлом» (или, может быть, нет). В этом случае вы можете использовать подзапрос с инструкцией WHERE по сравнению с датами (< или>)

Если «ближайшее время» находится как в прошлом, так и в настоящем, я бы, вероятно, скопировал его, написав хранимую процедуру, которая создает вспомогательную таблицу, содержащую наиболее релевантную «близкую дату» (From B) для каждой даты в таблице A. Таким образом, у меня будет больше контроля над поведением процедуры, и в будущем это будет легче изменить.

Оптимизация производительности всегда может произойти позже.

+0

Спасибо! Я обновил вопрос, поскольку он всегда близок к дате в прошлом. Но я не уверен, как правильно записать подзапрос? – Martin

+0

Отвечает ли Крис? – Tobiasopdenbrouw

0

Просто получите декартовую продукцию, а затем отфильтруйте неинтересные строки. В принципе:

select a.*, b.* 
from a, b 
where 
not exists (
    select null 
    from b b2 
    where abs(b2.date - a.date) < abs(b.date - a.date) 
) 

Я не знаю, поддерживает ли SQLite это жесткое.

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