2009-06-11 78 views
1

我試圖用DB2中的Table2中的數據更新DB1中的Table1。我可以將來自DB2 Table2的數據連接到DB1 Table1,但是我遇到的問題是從DB2 Table2獲取最新的最新數據。如何使用SQL中的最新數據更新另一個表?

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

回答

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) 

的替代方案(如果你有太多的控制)是建立在表2的觸發其提出的最新版本到時,它更新一個臨時表。

更新:更正了代碼。

+0

你正在比較f1和f3,所以我敢肯定,這將無法正常工作 – 2009-06-11 13:44:49

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

當然,在你的where子句。

如果我在讀你的問題吧,反正...

+0

我不認爲這是答案。 b.f3對於每一行都是NULL。他想用MAX(c.f3) – 2009-06-11 13:34:14

+0

這個好點,我責備早上。如果我正確閱讀,添加了OR子句來處理...... b.f3不會總是爲空,因爲它會更新一次,然後下一次他運行它時仍然需要工作。 – CodeRedick 2009-06-11 13:49:12

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 

如果表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(你不需要在兩個內部標準JOIN和WHERE子句順便一提)。該視圖將在需要跨服務器比較它們之前過濾出較早的行。

在SSIS中還有其他解決方案,使用Merge組件,Lookup組件或Join組件可能會更好。

相關問題