我无法找出解决此问题的最佳方法,
我有两个不同的项目列表, 一个在DB中,一个不在。这两个清单都有 项目ID和数量,我需要合并 将两个列表放入DB。
我的第一个倾向是将所有项目从数据库中拉出,然后在应用程序逻辑中合并两个列表。然后,我将从数据库中删除旧列表并插入新的合并列表。
我想我也可以为我要合并到数据库中的每个项目更新/插入,但这意味着许多查询(可能有一个我可以编写的存储过程,但我对存储过程并不热)。
我想知道SQL或应用程序逻辑在这种情况下是否会表现更好?
我还想听听其他人如何解决这个问题。
感谢。
更新:
以下是一些更多细节,
这不是一次性合并,它会发生几次。基本上我在我的应用程序中有一个包含项目列表的对象,最终这些项目需要放入数据库中。数据库中已有项目,因此我不能只插入项目,如果两个项目具有相同的ID,则必须增加数据库中项目的数量,并插入具有唯一ID的项目。
更多更新:
使用MySQL和PHP
答案 0 :(得分:1)
创建两个临时表,一个是旧DB数据的副本,另一个包含当前不在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 |
+-------+----------+
如果要将结果存储回原始数据表,只需在创建两个临时表后从原始表中删除,然后使用INSERT INTO original_table SELECT ...
添加整个SELECT语句。答案 1 :(得分:0)
更多细节会有所帮助,包括您正在使用的数据库平台。
与此同时......听起来它可能类似于数据库中的产品目录,以及您尝试合并的数据库外部的一些类似数据集,例如您的Barnes&在内布拉斯加州Bumpster的贵族商店折叠起来,您将他们的库存重新整合到您的主要商店。
如果两个系统中的“产品”ID相同,您可以在存储过程中创建一个循环结构,该循环结构将遍历外部集合,计算每个集合的数量,然后在主要产品中增加一些总计表
答案 2 :(得分:0)
您没有提及您正在处理的编程语言或数据库,但我会查看所选数据库的“ UPSERT ”命令的可用性。
对于Oracle,这将是MERGE INTO语句:http://www.psoug.org/reference/merge.html我认为SQLServer有一个“IF FOUND”语句或类似的东西(我经常不使用SQLServer,抱歉)。
基本上“upsert”是“插入或更新”,因此不必确定具有给定ID的行是否已存在,您只需说“这是我的数据,如果此ID不存在存在,插入它,如果它已经存在,则更新它。“
答案 3 :(得分: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