2009-07-28 94 views
1

我無法找出解決這個問題的最好方法,HOWTO合併到一個數據庫

我有一個項目的兩個不同的列表, 一個在DB,一個不是。這兩個清單都有 項目ID和數量,我需要將 這兩個清單合併到DB中。

我的第一個傾向是隻是將所有項目從數據庫中提取出來,然後在應用程序邏輯中合併這兩個列表。然後,我會從數據庫中刪除舊列表並插入新的合併列表。

我想我也可以更新/插入我想要合併到數據庫中的每個項目,但是這意味着很多查詢(也許存在一個存儲過程,我可以寫,但我不是那麼熱程序)。

我想知道SQL或應用程序邏輯在這種情況下會表現得更好嗎?

我也想聽聽其他人如何解決這個問題。

謝謝。

UPDATE:

這裏有一些更多的細節,

這不是一次合併,它會發生幾次。基本上我在我的應用程序中有一個包含項目列表的對象,最終這些項目需要放入數據庫中。數據庫中已有項目,因此我不能只插入項目,如果兩個項目具有相同的ID並且插入具有唯一ID的項目,則必須增加數據庫中項目的數量。

ONE MORE UPDATE:

使用MySQL和PHP

回答

0

更多細節將是有益的,包括你正在使用的數據庫平臺。

與此同時...這聽起來像它可能類似於您在數據庫中存在的產品目錄,以及您想要合併的數據庫之外的一些類似數據集,如可能是您的Barnes &諾貝爾在內布拉斯加州的Bumpster摺疊商店,你將他們的庫存重新整合到你的主要商店。

如果兩個系統中的「產品」ID相同,則可以在存儲過程中創建一個循環結構,它將循環訪問外部集合,計算每個系統的數量,然後在main中增加一些總數產品表。

1

創建兩個臨時表,一個是舊DB數據的副本,另一個是包含當前不在數據庫中的內容。然後對兩個表上的bag union進行分組查詢。

例如,給出下面的初始點,並假設MySQL的句法:

create temporary table a (name varchar(255), quantity int); 
create temporary table b (name varchar(255), quantity int); 
insert into a values ('fork', 1), ('spoon', 2); 
insert into b values ('fork', 2), ('knife', 1); 

然後,您可以簡單地運行下面的查詢來獲取你想要的結果。

select name, sum(quantity) AS quantity 
    from ((select * from a) union all (select * from b)) c 
    group by c.name; 

這將使你的結果:

+-------+----------+ 
| name | quantity | 
+-------+----------+ 
| fork |  3 | 
| knife |  1 | 
| spoon |  2 | 
+-------+----------+ 

如果你想存儲結果返回到原始數據表,從原始表只是刪除創建兩個臨時表後,再在前面加上整個SELECT語句與INSERT INTO original_table SELECT ...

0

你沒有提到你正在處理的是什麼編程語言或數據庫,但我會研究一下「UPSERT「命令用於您選擇的數據庫。

對於Oracle,這將是MERGE INTO語句:http://www.psoug.org/reference/merge.html我認爲SQLServer有一個「IF FOUND」語句或類似的東西(我不經常使用SQLServer,對不起)。

基本上「upsert」是一個「插入或更新」,所以不必決定是否已經存在一個給定ID的行,你可以說「這裏是我的數據,如果這個ID不是'如果它已經存在,那麼插入它,然後更新它。「

0

在MySQL中使用

INSERT INTO TABLE1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c = c+3 

你將不得不如果你使用不同的數據庫來改變語法。

如果使用臨時表方法,則不需要刪除主表,這可能會非常糟糕。

CREATE TEMPORARY TABLE temp1 .....identical to main table 
INSERT everything into temp1 

INSERT (colnames ...) INTO main1 SELECT (colnames ..) FROM temp1 
    ON DUPLICATE KEY UPDATE onhand = main1.onhand + temp1.onhand