插入没有重复

时间:2016-11-22 11:04:52

标签: sql-server

我有一个名为T_TEMP的临时表,其中我有3个字段(varchar),如下所示:

id, number, name.

我有另一个名为T的表,其中我有3个字段,一个带有身份(它是Sql Server 2008),称为id,另一个称为数字和名称。两者都是varchars,id是int。

我尝试了以下声明:

Insert into T (number,name) select distinct number,name from T_TEMP

尽管如此,insert语句已插入所有行,甚至是重复的行。具体来说,有42行有重复的数据。

任何人都可以帮我一些声明来插入或删除临时表中的副本吗?

修改

数据示例

ID        |         NUMBER       |   NAME

----------| -------------------- | ---------

25613278  | XX111111111BB        | B2930

25613279  | XX111111111BB        | G6336

25613280  | XX111111111BB        | G2344

4 个答案:

答案 0 :(得分:0)

您需要两个NOT EXISTS条款。表T_TEMP上的第一个(所以你只获得相同数字的第一行)。第二个,因为如果你多次运行这个查询,你保证主表(T)中没有重复。

试试这个:

 INSERT INTO T (number, name)
  SELECT tt.number, tt.name
  FROM T_TEMP tt
  WHERE NOT EXISTS(SELECT 'PREVIOUS'
  FROM T_TEMP tt2
  WHERE tt2.number = tt.number
  AND tt2.name < tt.name)
  AND NOT EXISTS(SELECT 'DUPLICATE'
  FROM T t2
  WHERE t2.number = tt.number)

答案 1 :(得分:0)

一个选项是在numbername列上添加唯一索引/约束:

CREATE UNIQUE INDEX u_index ON T (number, name)

现在,如果您的INSERT语句包含与numbername组合重复的记录,则会在数据库级别拒绝这些记录。

答案 2 :(得分:0)

INSERT INTO T (NUMBER, NAME) SELECT NUMBER, NAME FROM T_TEMP GROUP BY NUMBER, NAME

答案 3 :(得分:0)

最后我有解决方案:

<强>声明

INSERT INTO T
      (number,name) SELECT number,name
  FROM (
                SELECT  number,name,
                        ROW_NUMBER() OVER(PARTITION BY number ORDER BY id DESC) rn
                    FROM T_TEMP
) a
WHERE rn = 1

<强>解释

此语句确保仅采用RN的行,这是一个自我计算字段等于1.使用此where子句可确保避免重复。 RN字段由number计算,这是我想要唯一的字段。 order by id Desc子句允许将min id值作为unique number字段。