0

我需要将表中的列更新为另一个表中的最新日期/时间组合。如何从一个表中获取最新的日期/时间组合,然后在另一个表中使用该日期更新列?

我正在使用的两个表称为dbo.DDdbo.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 有时适用于这些情况,但我不确定如何实现。

4

1 回答 1

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;
于 2013-11-11T18:11:56.507 回答