在SQL Server中,如何将值插入表EXCEPT重复行?

时间:2014-08-24 18:31:31

标签: sql sql-server

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

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

2 个答案:

答案 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子句(即根据需要添加或删除比较)来控制唯一性范围(哪些列应该是唯一的组合)