table1
-----------------------------
| id (int) | dt (datetime) |
-----------------------------
| 1 | 12-12-2012 |
| 2 | 13-11-2013 |
| 3 | 23-07-2014 |
| 4 | 13-06-2014 |
-----------------------------
table2
-----------------------------
| id (int) | dt2 (datetime) |
-----------------------------
| 1 | 12-12-2012 |
| 1 | 13-11-2013 | -> update table1 id=1 with this dt2
| 2 | 23-07-2014 |
| 2 | 13-06-2014 |
| 2 | 12-12-2012 | -> update table1 id=2 with this dt2
| 3 | 13-11-2013 | -> update table1 id=3 with this dt2
| 3 | 23-07-2014 |
| 3 | 13-06-2014 |
| 4 | 23-07-2014 |
| 4 | 13-02-2014 | -> update table1 id=4 with this dt2
-----------------------------
我想根据table1.dt
使用dt2
的相应table2
更新id
。
但是,我不想将table1.dt
更新为table2.dt2
中对应的最大日期时间值。
我只想将dt
更新为不大于当前日期的最大对应dt2
。
到目前为止,我得到的是:
update table1
set table1.dt = table2.dt2
from table2
inner join table1 on table1.id = table2.id
where ?table1.id=table2.id and...?
不知道如何修改sql语句,使其仅将dt
更新为不大于当前日期的最大对应dt2
。
希望它不会太混乱......
答案 0 :(得分:1)
试试这个
UPDATE table1
SET [dbo].[Table1].dt = [dbo].[Table2].dt2
FROM [dbo].[Table2]
where [dbo].[Table2].id = [dbo].[Table1].id and [dbo].[Table2].dt2 > [dbo].[Table1].dt
and [dbo].[Table2].dt2 <= getdate()
如果我正在纠正你想要实现的目标,那么你需要在&#34;之后&#34;声明:如果id&#39; s相等,表2中的日期大于table1中的日期和table2中的日期小于今天?然后更新。
答案 1 :(得分:0)
您可以在派生表中使用group和aggregate,也可以查看cross apply。这是前者的一个例子。
update table1
set table1.dt = table2.dt2
from table1 join (
select id,max(dt2) as maxDT
from table2
group by id) as derivedTable2 on derivedTable2 .id = table1.id
答案 2 :(得分:0)
像这样的结构会起作用:
UPDATE table1
SET dt = dt2
FROM ( SELECT id AS _id ,
MAX(dt2) AS dt2
FROM ( SELECT T2.id ,
T2.dt2
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.id = T2.id
WHERE T2.dt2 < T1.dt
) A
GROUP BY id
) B
WHERE id = _id;