从一个表到另一个表的UPDATE列

时间:2013-11-11 18:09:10

标签: tsql sql-server-2012-express

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

我使用的两个表名为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有时会在这些情况下起作用,但我不确定如何实现。

1 个答案:

答案 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;