代码之家  ›  专栏  ›  技术社区  ›  JFV

如何用SQL中的最新数据更新另一个表?

  •  1
  • JFV  · 技术社区  · 17 年前

    我试图用DB2中Table2的数据更新DB1中的Table1。我可以将数据从DB2表2连接并获取到DB1表1中,但我遇到的问题是从DB2表2中获取最新数据。

    Update Table1
    Set f2 = c.f2, 
        f3 = convert(varchar, c.f3, 101) 
    From Table1 b 
        inner join Server.DB.dbo.Table2 c on b.f1 = c.f1
    Where b.f1 = c.f1 
    

    c.f1    c.f2         c.f3
    8456    RS47354      06/30/2009
    8456    M101021      10/31/2009 (want this one)
    7840    5574         NULL
    7840    RH013057     06/30/2010 (want this one)
    7650    RS48100      06/30/2007
    7650    RS49010      06/30/2009 (want this one)
    
    b.f1        b.f2         b.f3
    8456        Null         Null
    7840        Null         Null
    7650        Null         Null
    

    3 回复  |  直到 17 年前
        1
  •  1
  •   samjudson    17 年前

    UPDATE Table1
    SET 
        f2 = T2.f2, 
        f3 = convert(varchar, T2.f3, 101) 
    FROM 
        Table1 T1
    INNER JOIN 
        Server.DB.dbo.Table2 T2
    ON 
        T1.f1 = T2.f1
    WHERE 
        T2.f3 = (SELECT MAX(f3) FROM Server.DB.dbo.Table2 WHERE f1 = T1.f1)
    

    另一种方法(如果你有那么多控制权)是在Table2上创建一个触发器,每当更新时,它都会将最新版本放入临时表中。

        2
  •  1
  •   Tom H zenazn    17 年前
    UPDATE
         T1
    SET
         f2 = T2.f2,
         f3 = T2.f3  -- If it's a date, save it as a date, not a VARCHAR
    FROM
         dbo.Table1 T1
    INNER JOIN Server.db.dbo.Table2 T2 ON
         T2.f1 = T1.f1
    LEFT OUTER JOIN Server.db.dbo.Table2 T2_later ON
         T2_later.f1 = T2.f1 AND
         T2_later.f3 > T2.f3
    WHERE
         T2_later.f1 IS NULL
    

    CREATE VIEW dbo.T2_Latest
    AS
         SELECT
              T2.f1,
              T2.f2,
              T2.f3
         FROM
              dbo.Table2 T2
         LEFT OUTER JOIN dbo.Table2 T2_later ON
              T2_later.f1 = T2.f1 AND
              T2_later.f3 > T2.f3
         WHERE
              T2_later.f1 IS NULL
    

    然后你只需要在f1上加入(顺便说一句,在INNER join和WHERE子句中都不需要这个条件)。在需要跨服务器比较之前,该视图将过滤掉前面的行。

        3
  •  0
  •   CodeRedick    17 年前
    and (b.f3 > c.f3 OR b.f3 is null)
    

    不管怎样,如果我没看错你的问题。..