用另一个表中的最新值更新
Posted
技术标签:
【中文标题】用另一个表中的最新值更新【英文标题】:Update by the newest value in another table 【发布时间】:2020-01-29 13:55:47 【问题描述】:我在TableTap
中有salesperson´s
,我需要根据item
将这些更新到TableNim
。 TableTap
有一个日期 tap_Date
,我需要获取最新的 salesperson
。 Item
是 TableNim
中的唯一值。
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)
上的索引,这通常比窗口函数执行得更好。
【讨论】:
以上是关于用另一个表中的最新值更新的主要内容,如果未能解决你的问题,请参考以下文章