插入无重复
我有一个临时表称为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
需要两个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)
一种选择是在number
和name
列添加一个唯一索引/约束:
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
字段。
嗨,但如果你运行两次这个声明,你有重复的行。尝试 –
是的,这是真的,但问题是要避免在第一次插入重复。理论上我不会再从临时表中插入决赛桌。这是因为是手动数据清理过程。 – Maik
我已更新我的回答 –
我再次更新。现在没关系 –