根据另一个表中的数据更新表中的数据

时间:2014-03-12 15:51:00

标签: sql sql-server

 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

希望它不会太混乱......

3 个答案:

答案 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;