插入无重复

问题描述:

我有一个临时表称为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 

尽管这样的插入语句插入了所有行,即使是重复的行。特别是有42行重复的数据。

任何人都可以帮助我做一些陈述来做插入或删除临时表中的副本?

编辑

数据例如

ID  |   NUMBER  | NAME 

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

25613278 | XX111111111BB  | B2930 

25613279 | XX111111111BB  | G6336 

25613280 | XX111111111BB  | G2344 
+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) 
+0

我已经试过了,它有重复的行,但是我仔细阅读了你的答案,我发现它确保不存在具有几个值的行,但我需要的是数字不重复。例如,我有这个:NUMBER:1 NAME:yuio // NUMBER:1 NAME:peri。我只想插入其中一个。 – Maik

+0

我试过了,它不起作用。两个表的选择计数(*)是相同的:S – Maik

+0

@Maik:请发布一组您的输入数据 –

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

CREATE UNIQUE INDEX u_index ON T (number, name) 

现在,如果你INSERT声明将包括哪些是重复使用记录尊重number,name他们将在数据库级别被拒绝。

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

最后,我有解决方案:

声明

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,这是自排COMPUT ed字段等于1.使用此where子句可确保避免重复。 RN字段由number计算,这是我希望是唯一的字段。 order by id Desc子句允许将min id值作为unique number字段。

+0

嗨,但如果你运行两次这个声明,你有重复的行。尝试 –

+0

是的,这是真的,但问题是要避免在第一次插入重复。理论上我不会再从临时表中插入决赛桌。这是因为是手动数据清理过程。 – Maik