выберите отдельную строку в левом соединении - PullRequest
1 голос
/ 02 августа 2010

Таблица 1

ID
1
2
3

Таблица 2

ID    date    opt
1    1/1/10    1
1    1/2/10    0
2    1/1/10    1

Хочу

ID    date    opt
1    1/2/10    0
2    1/1/10    1

Как мне объединить эти 2 таблицы? Просто сопоставьте все идентификаторы в таблице 1 с их последним выбором в таблице 2. Без перегородок, пожалуйста. Я в sql 2005. Спасибо.

Ответы [ 3 ]

2 голосов
/ 02 августа 2010
Select ID, date, opt
From Table2 As T2
Where date = (
            Select Max(date)
            From Table2 As T3
            Where T3.ID = T.ID
            )
1 голос
/ 02 августа 2010

Вот решение без подзапросов:

SELECT t1.ID, t2.date, t2.opt
FROM Table1 t1
LEFT JOIN Table2 t2
  ON t2.ID = t1.ID
LEFT JOIN Table2 t3
  ON t3.ID = t1.ID AND t3.date > t2.date
WHERE t3.date IS NULL

Вы можете получить дубликаты, если у вас есть две записи в таблице 2 с одинаковыми «последними» датой и идентификатором.Однако вы можете добавить дополнительные условия для обработки двух записей с одинаковой «последней» датой.Кроме того, вы получите значения NULL для даты и opt, если в таблице 2 нет соответствующей записи.

В книге SQL Antipatterns . * Есть целая глава об этом типе решения.1008 *

0 голосов
/ 02 августа 2010
select t1.ID, t2.date, t2.opt
from (
    select ID, max(date) as MaxDate
    from Table2 
    group by ID
) t2m
inner join Table2 t2 on t2m.ID = t2.ID and t2.MaxDate = t2.date
inner join Table1 t1 on t2.ID = t1.ID
...