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

时间:2009-06-11 13:22:04

标签: sql sql-server-2005 ssis

我正在尝试使用DB2中Table2的数据更新DB1中的Table1。我可以连接并从DB2 Table2获取数据到DB1 Table1,但我遇到的问题是从DB2 Table2获取MOST RECENT数据。

我正在查看DB2中的3个字段:f1,f2和& F3。 f1包含重复项(并且是我从DB1 Table1匹配的地方),f3是日期字段,我想获取更新DB1 Table1的最新日期。以下是我一直在使用的一些代码:

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

最终,这将在SSIS包中设置。

任何和所有帮助表示赞赏!

-JFV

3 个答案:

答案 0 :(得分:1)

我不确定这是否是世界上禁食的代码,显然取决于两台服务器的接近程度以及每张表中的数据量。

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上创建一个触发器,它会在更新时将最新版本放入临时表中。

更新:更正了代码。

答案 1 :(得分:1)

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

如果Table2很大,这可能会在服务器上执行某些性能问题。最好在该数据库中创建一个视图并将其用于更新:

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子句中都不需要那个标准)。该视图将在需要跨服务器进行比较之前过滤掉之前的行。

在SSIS中还有其他解决方案,使用Merge组件,Lookup组件或Join组件可能会更好。

答案 2 :(得分:0)

and (b.f3 > c.f3 OR b.f3 is null)

当然,在你的where子句中。

如果我正确地读你的问题,无论如何......