如何使用SQL中的最新数据更新另一个表?
我试图用DB2中表2的数据更新DB1中的表1。我可以将DB2 Table2中的数据连接到DB1 Table1中,但我遇到的问题是从DB2 Table2中获取最新的数据 我正在查看DB2中的3个字段:f1、f2和f3。f1包含重复项(这是我从DB1 Table1匹配的地方),f3是一个日期字段,我想获取更新DB1 Table1的最新日期。下面是我一直在使用的一些代码:如何使用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
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