我有两张桌子
表a(每个id 1行)
id,observation_date
a,2015-03-01
b,2015-03-03
c,2015-03-05
表b(每个id多行,但每个id / date组合唯一)
id, insert_date, value
a,2015-02-28,x1
a,2015-03-01,x2
a,2015-03-02,x3
b,2015-02-28,x4
b,2015-03-01,x5
b,2015-03-02,x6
c,2015-02-28,x7
c,2015-03-01,x8
c,2015-03-02,x9
c,2015-03-03,x10
c,2015-03-04,x11
我想在id上加入这些表,但是我想加入我希望在表b中与表a中的观察日期相关的最近插入日期加入的日期(其中日期在之前或之前)与观察日期同一天)
即。输出应该是:
id,observation_date,insert_date,value
a,2015-03-01,2015-03-01,x2
b,2015-03-03,2015-03-02,x6
c,2015-03-05,2015-03-04,x11
答案 0 :(得分:1)
执行此操作的典型方法是使用相关子查询,每个值对应一个:
select a.*,
(select b.date
from b
where b.id = a.id and b.insert_date <= a.observation_date
order by b.insert_date desc
fetch first 1 row only
) as insert_date,
(select b.value
from b
where b.id = a.id and b.insert_date <= a.observation_date
order by b.insert_date desc
fetch first 1 row only
) as value
from a;
也有两种类似的方法。使用相关子查询获取日期,然后联接回表以获取其余值。或者,如果您的数据库支持它,请使用横向连接(在SQL Server中使用apply
)。一个更复杂的方法涉及连接和group by
,我不推荐。
请注意fetch first 1 row only
是ANSI SQL。您的数据库可能会为此目的使用其他内容,例如TOP
或LIMIT
。
答案 1 :(得分:1)
试试这个
SELECT *
FROM TABLEA TA
INNER JOIN TABLEB TB
ON TA.ID=TB.ID
AND TB.INSERT_DATE =
(SELECT MAX(TB_E.INSERT_DATE) FROM TABLEB TB_E WHERE TB_E.ID=TB.ID AND TA.OBSERVATION_DATE >= TB_E.INSERT_DATE)