在SQL Server中,除了重复行之外,如何将值插入表中?

在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),最多有一行 目前,

我编写了一个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语句中删除


如何在不手动检查重复的情况下将此数据输入数据库?

创建第二个表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
    )