我编写了一个python脚本,它将查看文本文件并创建将代码插入表中的SQL代码。
看起来像这样:
insert into table1 (date, locid, personid, itemid, amounts)
values (val11,val12,val13,val14,val15)
,(val21,val22,val23,val24,val25)
数据的结构使得对于一组特定值的前四列(date, locid, personid, itemid)
,最多只有一行。
目前,我必须手动检查表中是否已存在条目,然后将其从insert语句中删除。
如何在不手动检查重复的情况下将此数据输入数据库?
答案 0 :(得分:0)
使用DDL创建第二个表table2,仅用于插入中涉及的列。
将您的插入放入table2。
然后运行:
insert into table1 (date, locid, personid, itemid, amounts)
select t2.* from table2 t2
join(
select locid, personid, itemid, amounts from table2
except
select locid, personid, itemid, amounts from table1) x
on t2.locid = x.locid
and t2.personid = x.personid
and t2.itemid = x.itemid
and t2.amounts = x.amounts
然后你可以删除table2。
并且table1将仅填充那些INSERTS,其中所有4列中的值与table1的任何现有行上的所有4列不匹配。
这假设您不希望INSERT仅在所有4列中存在匹配时才通过。换句话说,如果存在4列中的3列匹配的行,则上述将执行INSERT。只有当所有4列都存在完全匹配的行时,它才会停止INSERT。
如果您还生成了重复的INSERT语句,只需将DISTINCT运算符添加到查询中,“从table2 t2中选择DISTINCT t2。*”
正如ludwigmace在评论中指出的那样也可以尝试下面的内容并比较性能差异,它应该在功能上是等效的(如果插入不包含重复项,你可以去除组)--- < / p>
insert into table1 (date, locid, personid, itemid, amounts)
SELECT t2.date, t2.locid, t2.personid, t2.itemid, t2.amounts
FROM table2 t2
LEFT JOIN t1
ON t2.date = t1.date
AND t2.locid = t1.locid
AND t2.personid = t1.personid
AND t2.itemid = t1.itemid
WHERE t1.date is null
GROUP BY t2.date, t2.locid, t2.personid, t2.itemid, t2.amounts
答案 1 :(得分:-1)
这应该有效:
INSERT INTO [table1] ([date], [locid], [personid], [itemid], [amounts])
SELECT val1, val2, val3, val4, val5
WHERE NOT EXISTS
(
SELECT * FROM [table1] WHERE [date]=val1 AND [locid]=val2 AND [personid]=val3 AND [itemid]=val4
)
不是直接插入值,而是从select语句的结果中插入。 select语句精心设计为仅返回您指定的值(如果它们不存在)
您可以通过修改第二个选择中的Where子句(即根据需要添加或删除比较)来控制唯一性范围(哪些列应该是唯一的组合)