Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL中的最新数据更新另一个表?_Sql_Sql Server 2005_Ssis - Fatal编程技术网

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

如何使用SQL中的最新数据更新另一个表?,sql,sql-server-2005,ssis,Sql,Sql Server 2005,Ssis,我试图用DB2中表2的数据更新DB1中的表1。我可以将DB2 Table2中的数据连接到DB1 Table1中,但我遇到的问题是从DB2 Table2中获取最新的数据 我正在查看DB2中的3个字段:f1、f2和f3。f1包含重复项(这是我从DB1 Table1匹配的地方),f3是一个日期字段,我想获取更新DB1 Table1的最新日期。下面是我一直在使用的一些代码: Update Table1 Set f2 = c.f2, f3 = convert(varchar, c.f3, 101

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

我正在查看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

当然,在where子句中


如果我没有看错你的问题,无论如何…

我不确定这是否是世界上最快的代码,这显然取决于两台服务器的距离以及每个表中的数据量

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

更新:更正了代码

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
如果表2很大,那么跨服务器执行此操作可能会有一些性能问题。最好在该数据库中创建一个视图,并将其用于更新:

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上连接(顺便说一下,在内部连接和WHERE子句中都不需要该条件)。在需要跨服务器比较之前,视图将过滤掉前面的行


在SSI中还有其他解决方案,使用合并组件、查找组件或连接组件可能会更好。

我认为这不是答案。b、 f3对于每一行都为空。他想用马克斯(c.f3)的好观点抓住这一排,我责备早晨。添加了一个OR子句来处理。。。同样,如果我读得正确,b.f3不会总是空的,因为它会更新一次,然后下次他运行它时,它仍然需要工作。你正在比较f1和f3,所以我很确定这不会工作correctly@samjudson我能够使用您的方法使代码正常工作,但是更新代码确实需要一些时间。我正在考虑设置一个触发器,在更新或插入表2之后立即更新表1,这样信息将实时更新,而不是每晚更新。你认为触发式更新会更快吗(在我第一次集体更新之后)?是的,快得多。另外,我注意到您正在将日期从日期转换为字符串。如果可以将这两个字段都作为日期,那么它将加快速度,因为不必进行转换。@Tom H.我尝试了该视图,但它仍然会出现重复数据,我不确定为什么。。。顺便说一句,日期字段将被另一个数据库中的一个nvarchar(10),这就是我重新格式化它的原因。如果有多行具有相同ID的相同确切日期,那么您将获得重复的数据。在这种情况下,您需要进一步定义什么构成“最新”行。至于到nvarchar(10)的日期,我假设您正在转换它,因为这就是目标数据库中的日期。我的观点是,目的地不应该是这样。
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