在SQL Server中,除了重复行之外,如何将值插入表中?
我编写了一个python脚本,它将查看文本文件并创建SQL代码,将数据插入表中 看起来是这样的:在SQL Server中,除了重复行之外,如何将值插入表中?,sql,sql-server,Sql,Sql Server,我编写了一个python脚本,它将查看文本文件并创建SQL代码,将数据插入表中 看起来是这样的: insert into table1 (date, locid, personid, itemid, amounts) values (val11,val12,val13,val14,val15) ,(val21,val22,val23,val24,val25) 数据的结构是,对于一组特定的值,前四列(日期、locid、personid、itemid),最多有一行 目前,
insert into table1 (date, locid, personid, itemid, amounts)
values (val11,val12,val13,val14,val15)
,(val21,val22,val23,val24,val25)
数据的结构是,对于一组特定的值,前四列(日期、locid、personid、itemid)
,最多有一行
目前,我必须手动检查表中是否已经存在条目,然后将其从insert语句中删除
如何在不手动检查重复的情况下将此数据输入数据库?创建第二个表table2,其中DDL仅用于插入中涉及的列 在表2中插入内容 然后运行:
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
然后您可以删除表2
表1将只填充那些所有4列中的值都与表1任何现有行中的所有4列不匹配的插入
这假设您不希望只有在所有4列中都存在匹配项时插入。换言之,如果有一行4列中的3列匹配,则上述操作将执行插入操作。它仅在所有4列上已经存在完全匹配的行时停止插入
如果还生成了重复的INSERT语句,只需将DISTINCT运算符添加到查询中,“从表2 t2中选择DISTINCT t2.*”
正如ludwigmace在评论中指出的那样,您也可以尝试以下方法并比较性能差异,它在功能上应该是等效的(如果插入不包含重复项,您可以通过---
这应该起作用:
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语句被精心设计为仅返回您指定的值(如果它们不存在)
通过修改第二个select中的Where子句(即根据需要添加或删除比较),可以控制唯一性的范围(哪些列的组合应该是唯一的)如果您有两行与两个金额刚好不同,那么会发生什么情况?表中应该显示哪一个金额?检查所有列,而只显示前4列checked@Mark我误读了他的话,认为他有多个相同的插入,并希望使插入独特。我只是改变了我的答案。它将在表1中插入所有不会导致这4列中的值重复的插入。如果
table2
包含t1
中尚不存在的重复行,则不会给出所需的结果。(我没有投票,这不重要。)如果你说他的插页可能包含重复的内容,那么我同意,但这看起来并不是他的问题。问题表明,他希望检查表1中已经存在的行中是否存在“重复项”(而不是是否生成了重复的insert语句)。然而,如果是这样的话,他所要做的就是添加一个单词,我喜欢这样做——首先将数据输入数据库,然后将数据输入我的表格。我不知道SQL是如何优化这3条select语句的,所以我会选择:select t2.date,t2.locid,t2.personid,t2.itemid,t2.amounts FROM table2 t2在t2.date=t1.date和t2.locid=t1.locid和t2.personid=t1.personid和t2.itemid=t1.itemid,其中t1.date是空组,t2.locid,t2.personid,t2.itemid,t2.amounts
而不是添加了多行数据的单个insert语句,OP的代码将执行一系列insert语句,每行一条。看起来有点重。
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
)