2013-02-25 120 views
0

我有2個sql表格,格式完全相同,1個用作臨時表,1個用作靜態表。如何比較2個表,刪除舊記錄並添加新記錄sql

目前我的代碼只是擦除靜態表並每次使用臨時表中的新數據填充它,但這不完全是我所需要的。我試圖創建一些類型的SQL比較比較這兩個表,然後將刪除不在臨時表中但在靜態表中的記錄,它會添加新的記錄在臨時表中但不是靜態表格。所以靜態表只是每次更新而不是被擦除和重寫。

所以,如果我的臨時表有:ABC1,ABC2,ABC4 和我的靜態表已:ABC1,ABC3,ABC4

我的SQL查詢在理想情況下返回:ABC1,ABC2,ABC4

我有2查詢似乎選擇我想要刪除的值和我想要添加的值,但我目前無法讓刪除一個正常工作,所以我想知道是否有什麼我從查詢中丟失。

這個查詢插入那就是在臨時表中的數據,而不是靜態的表格:

Insert into [static table] 
    SELECT * 
    FROM [temp table] 

EXCEPT 

SELECT * 
    FROM [static table] 

該查詢應刪除的靜態表中的數據而不是臨時表:

delete from [static table] 
where not exists 
    (SELECT * 
    FROM [static table] 

EXCEPT 

SELECT * 
    FROM [temp table]) 

任何人都可以提出什麼問題與我的查詢,或者如果有更好的方式來執行此任務?謝謝

+0

你使用什麼風格的SQL? – AdaTheDev 2013-02-25 10:15:34

+0

我正在使用sql server 2008 – RebeccaD 2013-02-25 10:20:03

回答

1

看看MERGE這是在2008年SQL

例如引入未經檢驗的,但像...

MERGE StaticTable AS target 
USING TempTable AS source ON target.ColumnA = source.ColumnA 
-- value doesn't exist in the target table, so add it 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ColumnA) VALUES (source.ColumnA) 
-- value doesn't exist in the source table, so delete from target 
WHEN NOT MATCHED BY SOURCE THEN 
    DELETE 

編輯:要在多列的工作,是這樣的:

MERGE StaticTable AS target 
    USING TempTable AS source ON target.ColumnA = source.ColumnA 
     AND target.ColumnB = source.ColumnB 
    -- value doesn't exist in the target table, so add it 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT (ColumnA, ColumnB) VALUES (source.ColumnA, source.ColumnB) 
    -- value doesn't exist in the source table, so delete from target 
    WHEN NOT MATCHED BY SOURCE THEN 
     DELETE 
+0

有沒有辦法做到這一點,但使用所有列標題?只是我沒有關鍵字段,因爲我的記錄適用於多種語言,因此ID可能會出現在幾種語言中,這就是爲什麼我需要將搜索基於幾列。 – RebeccaD 2013-02-25 10:42:48

+0

查看更新的回答 – AdaTheDev 2013-02-25 10:46:20

0

如果你的表有你可能可以使用任何語法定義的唯一鍵:

DELETE FROM static WHERE id NOT IN(SELECT id from temporary); 
INSERT INTO static WHERE id IN(SELECT id from temporary) AND NOT id IN (SELECT id from static); 
+0

我沒有唯一的密鑰,因爲我的記錄適用於所有不同的語言,因此可能會出現幾種語言的相同ID。當我嘗試你的建議時,我得到:「只有一個表達式可以在子查詢不與EXISTS引入時在選擇列表中指定。」 – RebeccaD 2013-02-25 10:38:57

相關問題