我正在尝试使用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
答案 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子句中。
如果我正确地读你的问题,无论如何......