用另一个表中的最新值更新

Posted

技术标签:

【中文标题】用另一个表中的最新值更新【英文标题】:Update by the newest value in another table 【发布时间】:2020-01-29 13:55:47 【问题描述】:

我在TableTap 中有salesperson´s,我需要根据item 将这些更新到TableNimTableTap 有一个日期 tap_Date,我需要获取最新的 salespersonItemTableNim 中的唯一值。

TableTap
| salesperson   | item  | tap_Date
|---------------|-------|-----------
| person1       | item1 | 2020-01-20
| person1       | item1 | 2020-01-21
| person1       | item2 | 2020-01-22
| person2       | item2 | 2020-01-22
| person2       | item3 | 2020-01-23

结果应该是:

TableNim
| salesperson   | item  |
|---------------|-------|
| person1       | item1 |
| person2       | item2 |
| person2       | item3 |

我尝试了以下方法

UPDATE TableNim SET TableNim.myyja =
(SELECT TOP 1 salesperson FROM TableTap
WHERE spec = 1 
and salespersons > '' 
and customer > ''
ORDER BY tap_Date DESC)
FROM TableNim, TableTap
WHERE
TableTap.item = TableNim.item

查询的结果是每一行都只有一个相同的销售人员。 有什么帮助吗?

【问题讨论】:

您使用的是哪个 dbms? (也许是 MS SQL Server?) 是的,MS SQL 服务器 稍微绕道...但是 ANSI-92 样式连接已经存在了将近 30 年。是时候更新你的语法了。 sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins 【参考方案1】:

你可以试试下面的

update tablenim 
   set salesperson=b2.salesperson
  from (select row_number() over(partition by item order by tap_date desc) as rnk
              ,salesperson
              ,item 
          from tabletap
        ) b2
  join tablenim b 
    on b.item=b2.item
   and b2.rnk=1

【讨论】:

【参考方案2】:

一个非常简单的方法是关联子查询或cross apply

update n
    set item = t.item
    from TableNim n cross apply
         (select top (1) t.*
          from TableTap t
          where t.salesperson = n.salesperson
          order by tap_date desc
         ) t;

使用TableTab(salesperson, tap_date desc, item) 上的索引,这通常比窗口函数执行得更好。

【讨论】:

以上是关于用另一个表中的最新值更新的主要内容,如果未能解决你的问题,请参考以下文章

用另一个表中的值更新一个表

MYSQL:我想用另一个表中的值更新表中的所有行,其中第一个表中的值等于第二个表

用另一个表中的值更新一个表

用另一个表中的最早日期更新表

用另一个表中的随机条目更新表的列

用另一个表上的值更新新添加的列