我需要将表中的列更新为另一个表中的最新日期/时间组合。如何从一个表中获取最新的日期/时间组合,然后在另一个表中更新具有该日期的列?
我使用的两个表名为dbo.DD
和dbo.PurchaseOrders
。两个表之间的JOIN是dbo.DueDate.XDORD = dbo.PurchaseOrders.PBPO AND dbo.DueDate.XDLINE = dbo.PurchaseOrders.PBSEQ
。 dbo.DueDate中我需要最新日期/时间的列是dbo.DueDate.XDCCTD and dbo.DueDate.XDCCTT
。
我需要设置dbo.PurchaseOrders.PBDUE = dbo.DueDate.XDCURDT
。我不能在UPDATE语句中使用ORDER BY语句,所以我不知道如何做到这一点。我知道row_number有时会在这些情况下起作用,但我不确定如何实现。
答案 0 :(得分:3)
一般模式是:
;WITH s AS
(
SELECT
key, -- may be multiple columns
date_col,
rn = ROW_NUMBER() OVER
(
PARTITION BY key -- again, may be multiple columns
ORDER BY date_col DESC
)
FROM dbo.SourceTable
)
UPDATE d
SET d.date_col = s.date_col
FROM dbo.DestinationTable AS d
INNER JOIN s
ON d.key = s.key -- one more time, may need multiple columns here
WHERE s.rn = 1;
我没有尝试映射你的表名和列,因为(a)我没有从你的单词问题得到哪个表是源,哪个是目的地;(b)那些列名看起来像字母汤和无论如何,我会搞砸它们。
看起来虽然OP得到了这个特定的代码:
;WITH s AS
(
SELECT
XDORD, XDLINE,
XDCURDT,
rn = ROW_NUMBER() OVER
(
PARTITION BY XDORD, XDLINE
ORDER BY XDCCTD DESC, XDCCTT desc
)
FROM dbo.DueDate
)
UPDATE d
SET d.PBDUE = s.XDCURDT
FROM dbo.PurchaseOrders AS d
INNER JOIN s
ON d.PBPO = s.XDORD AND d.PBSEQ = s.XDLINE
WHERE s.rn = 1;