2009-01-20 72 views
1

我每天都會收到大量當前帳號,並將它們存儲在數據庫中。我的任務是從每個文件中查找添加和發佈的帳戶。現在,我有4個SQL表(AccountsCurrent,AccountsNew,AccountsAdded,AccountsRemoved)。當我收到一個文件時,我將其全部添加到AccountsNew中。然後運行下面的查詢來查找我們添加和刪除的內容。差異大數據列表的最佳方式,算法和方法是什麼?

INSERT AccountsAdded(AccountNum, Name) SELECT AccountNum, Name FROM AccountsNew WHERE AccountNumber not in (SELECT AccountNum FROM AccountsCurrent) 

INSERT AccountsRemoved(AccountNum, Name) SELECT AccountNum, Name FROM AccountsCurrent WHERE AccountNumber not in (SELECT AccountNum FROM AccountsNew) 

TRUNCATE TABLE AccountsCurrent 

INSERT AccountsCurrent(AccountNum, Name) SELECT AccountNum, Name FROM AccountsNew 

TRUNCATE TABLE AccountsNew 

現在,我正在區分大約250,000個帳戶,但這種情況將持續增長。這是最好的方法嗎,你有其他想法嗎?編輯: 這是一個MSSQL 2000數據庫。我正在使用c#來處理文件。

我唯一關注的數據是在最近和當前文件之間添加和刪除的帳戶。 AccountsCurrent僅用於確定添加或刪除哪些帳戶。

+0

你可能會更好地關閉C#標記,這是一個直接的sql問題。 – 2009-01-20 15:17:00

+0

另外,你可以說你正在使用什麼數據庫?有可能數據庫特定的優化。 – 2009-01-20 15:19:23

+0

另外,不要使用IN語句,留下外連接並檢查null,這將會快得多。 – 2009-01-20 20:16:33

回答

1

說實話,我認爲我會遵循你的方法。有一件事是你可以刪除截斷,重命名「新」到「當前」,並重新創建「新」。

+0

這是一個有趣的想法。我喜歡... – duffymo 2009-01-20 15:40:54

1

聽起來像歷史/審計過程,可能會更好地使用觸發器完成。有一個可以捕捉變化的單獨歷史記錄表(例如,時間戳記,操作,執行更改的人員等)

新的和已刪除的帳戶很容易理解。 「當前」帳戶意味着在新建和刪除之間存在一箇中間狀態。我沒有看到「新」和「添加」之間的任何區別。

我不會有四張桌子。我有一個STATUS表,它可能有不同的狀態,而ACCOUNTS或HISTORY表會有一個外鍵。

+0

問題在於我不想結束當前表中狀態爲'REMOVED'的帳戶。我也不需要歷史記錄,我只需要在當前文件中添加和刪除列表。當前列表實際與下一個文件一起使用,以確定是否添加或刪除了一個帳戶。 – scottm 2009-01-20 15:42:04

1

在長列表中使用IN子句可能會很慢。

如果表進行索引,使用LEFT JOIN可以證明是更快......

INSERT INTO [table] (
    [fields] 
    ) 
SELECT 
    [fields] 
FROM 
    [table1] 
LEFT JOIN 
    [table2] 
     ON [join condition] 
WHERE 
    [table2].[id] IS NULL 

這假定1:1的關係,而不是1:很多。如果你有1:很多,你可以做任何的...
1. SELECT DISTINCT
2.使用GROUP BY子句
3.使用不同的查詢,見下文......

INSERT INTO [table] (
    [fields] 
    ) 
SELECT 
    [fields] 
FROM 
    [table1] 
WHERE 
    EXISTS (SELECT * FROM [table2] WHERE [condition to match tables 1 and 2]) 

-- # This is quick provided that all fields to match the two tables are 
-- # indexed in both tables. Should then be much faster than the IN clause. 
0

您也可以減去交點以獲得一個表中的差異。

0

如果初始文件以合理且一致的方式排序(大IF!),它將作爲一個C#程序運行得相當快,從邏輯上比較這些文件。

相關問題