我有一个名为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
答案 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)
一个选项是在number
和name
列上添加唯一索引/约束:
CREATE UNIQUE INDEX u_index ON T (number, name)
现在,如果您的INSERT
语句包含与number
,name
组合重复的记录,则会在数据库级别拒绝这些记录。
答案 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
字段。