在左连接中选择一个不同的行

时间:2010-08-02 16:43:24

标签: sql-server left-join

表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

如何加入这两张桌子?只需将表1中的所有ID与最近的表2中的选项进行匹配即可。 请不要分区。我在sql 2005.谢谢。

3 个答案:

答案 0 :(得分:2)

Select ID, date, opt
From Table2 As T2
Where date = (
            Select Max(date)
            From Table2 As T3
            Where T3.ID = T.ID
            )

答案 1 :(得分:1)

这是没有子查询的解决方案:

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中有两个条目具有相同的“最新”日期和ID,则可能会出现重复项。但是,您可以添加其他条件来处理具有相同“最新”日期的两个条目。此外,如果表2中没有相应的记录,您将获得date和opt的NULL值。

SQL Antipatterns一书中,有一整章关于此类解决方案。

答案 2 :(得分:0)

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