2016-01-08 46 views
-1

SQL對於所有事情來說都很新穎,因此希望您能忍受我。幫助創建UPDATE語句請

我有一個情況,我有一個臨時表中有大約11列和100行的數據。目的地表格包含大約27列和100行。

我正在嘗試使用T-SQL腳本創建一個服務器代理作業,以從暫存表中更新目標表,但僅限於需要的列。

Staging Table 
Col1 - Col11 

Destination Table 
Col1 - Col27 

我需要保留目標表中的「剩餘」列,因爲它們保存的數據不是由臨時表提供的。

我還應該指出,臨時表中的記錄數量將會隨着時間的推移而不斷增長,並且代理作業的計劃將每小時查找臨時表以進行更新。

這是我目前的腳本,它可以成功完成,但目標表中的每一行都由登臺表的第一行中的數據填充。

例如分期表Col1 = David和Col2 = Smith。

一旦執行下面的查詢,目標表中的所有行包含每個記錄的列1和2中的David和Smith。

UPDATE DestTable 
SET DestTable.Col1 = StagingTable.Col1, 
    DestTable.Col2 = StagingTable.Col2, 
FROM StagingTable 

我已經使用WHERE聲明匹配ID的數據,但對於任何新的記錄在臨時表等待時,ID將不會由目標表「已知」考慮。

最後,臨時表將爲目標表提供新記錄,更新現有記錄以及還有要刪除的記錄。

在此先感謝,併爲'散文'道歉。

+0

你應該做的第一件事是你比較了該列決定。提供一些縮小的示例和目標表以及您正在查找的結果。 –

+0

稍微偏離主題 - >如果您的臨時表包含希望添加到目標表中的新行,那麼您有幾個選擇。您可以執行serperate [UPDATE](https://msdn.microsoft.com/en-us/library/ms177523.aspx)和[INSERT](https://msdn.microsoft.com/en-us/library/ms174335 .aspx)語句。或者你可以看看[MERGE](https://msdn.microsoft.com/en-GB/library/bb510625.aspx)查詢,這些可能有點讓人望而生畏,但它們確實允許你將更新和插入一個聲明。 –

+0

謝謝,我會再考慮MERGE選項。 – speshfesh

回答

2

UPDATE聲明與StagingTableDestTable之間的INNER JOIN聯合應該給你你想要的行爲:

UPDATE t1 
SET t1.Col1 = t2.Col1, 
    t1.Col2 = t2.Col2 
FROM DestTable t1 
INNER JOIN StagingTable t2 ON (t1.Col1 = t2.Col1 AND t1.Col2 = t2.Col2) 
+0

謝謝蒂姆,我已經試過你的查詢,但我得到可怕的多部分標識符無法綁定。 – speshfesh

+0

再試一次,抱歉。由於Stack Overflow^^,這個錯誤不再那麼可怕了。 –

+0

再次感謝蒂姆,我仍然有幾個問題,但您修改後的查詢正確執行。現在唯一的問題是,結果告訴我沒有行受到影響,即使我知道col1和col2中的數據在兩個表中都完全不同。 – speshfesh