2017-01-17 33 views
-3

我从那里我需要更新我的当前表,但借命令基于列一个历史悠久的表更新表,但通过第一场比赛,然后通过第二

首先看看在历史悠久的桌子和更新,并且最后日期只有在没有匹配的更新从下一个最后的日期等等。

我的想法是通过获取最大日投入循环,然后加入递归直到分钟日期在历史悠久的表。

任何输入将不胜感激。

历史见下表。现在考虑更新我的表,它有S_Numb 18992所以没有匹配,但如果它的1891它应该更新ABC1。表中没有日期字段需要更新。

S_Numb S_Name S_date 
19891 ABC1 2017-01-13 
19891 ABC2 2017-01-06 
19891 ABC3 2016-12-30 
11631 ABC2 2016-12-16 
11631 ABC3 2016-12-09 
11631 ABC4 2016-12-02 
11631 ABC5 2016-11-25 
11631 ABC6 2016-11-18 
11631 ABC7 2016-11-11 
13213 ABC1 2016-11-04 
13213 ABC2 2016-10-28 
13213 ABC3 2016-10-21 
13213 ABC4 2016-10-14 
13213 ABC5 2016-10-07 
13213 ABC6 2016-09-30 
13213 ABC7 2016-09-16 
+4

你尝试过什么?用一些示例数据显示你的表格结构。 – dfundako

+0

我已经添加了一个表 –

回答

0

你可以使用cross apply来获取最新的值是这样的:

交叉apply

--update c set c.ColumnToUpdate = x.ColumnToUpdate 
select x.ColumnToUpdate, c.* 
    from Current as c 
    cross apply (
     select top 1 
      h.ColumnToUpdate 
     from History 
     where h.Id = c.Id 
     order by h.Date desc 
      ) as x 
    where c.ColumnToUpdate != x.ColumnToUpdate; 

与问题更新一些代码注释更新时间:

update c set c.S_Name = x.S_Name 
--select x.S_Name, c.* 
    from Current as c 
    cross apply ( /* only returns rows where there is a result */ 
     select top 1 -- only first result 
      h.S_Name -- column to update 
     from History 
     where h.S_Numb = c.S_Numb -- column to match on 
     order by h.Date desc -- most recent date first 
      ) as x 
    where c.S_Name != x.S_Name; 
+0

真棒,这工作。理解逻辑需要时间。 –

0

我们找到了D使用一些样本数据,但假设这两个表中的每一行有一个名为SomeID的ID,而历史悠久的表有一个名为YourCreatedTimeStamp时间戳,并且你会在一个名为SomeField场喜欢更新值...

update CurrentTable 
    set SomeField = 
     (
     select SomeField 
     from HistoricTable 
      inner join 
       (
       select 
         SomeId 
        ,max(YourCreatedTimeStamp) as LastCreatedTS 
       from HistoricTable 
       group by SomeId 
       ) LastEntryForEachId 
      on HistoricTable.SomeId = LastEntryForEachId.SomeId 
       and HistoricTable.YourCreatedTs = LastEntryForEachId.LastCreatedTs) 
where SomeId = [The Id You Are Interested in Updating) 
+0

我更新了一个示例表。当前表格没有时间戳记 –

+0

创建的时间戳记仅在历史表格中是必需的。 –

+0

是的,它的历史记录基于我需要做的匹配,但我想拉最新的。 @SqlZim提供的解决方案为我工作。 –