SQL将值从一个表复制到另一个表,但将重复项移动到另一个表

时间:2013-04-24 11:32:04

标签: sql sql-server-2008 duplicates

我想知道是否有人可以帮助我?

在我的数据库中,我有两个表具有相同的列并包含相同类型的数据。我的第一张桌子是我们过去6年来一直保持的,并且有几百万张记录。我的第二张表是我们从其他地方获得的,包含超过1亿条记录。表2中的某些数据可能已包含在表1中。

我想要实现的是将表二中的唯一记录添加到表一中。

我的PK对于两个表都是相同的,并且正是这个列可以识别它是否是重复的。

问题出现了,我需要在流程结束时显示重复记录,以便对这些记录进行审核。

我对SQL有很好的基础知识,但还不够先进,无法实现这一目标。 如果有人能够提供帮助,将不胜感激。

4 个答案:

答案 0 :(得分:0)

请尝试:

INSERT INTO Table1
SELECT DISTINCT * FROM Table1 
WHERE PrimaryKeyColumn NOT IN (SELECT PrimaryKeyColumn from Table1)

答案 1 :(得分:0)

这样的事情:

-- store the duplicates
SELECT t2.id
INTO #tempTable
FROM table2 t2
JOIN table1 t1 ON t1.id = t2.id

-- insert the non-duplicates
SELECT t2.*
INTO table1
FROM table2 t2
LEFT JOIN #tempTable t1 ON t1.id = t2.id
-- Alternative to above - LEFT JOIN table1 t1 ON t1.id = t2.id
WHERE t1.id IS NULL

-- display the duplicates
SELECT t1.*, t2.*
FROM #tempTable
JOIN table1 t1 ON tempTable.id = t1.id
JOIN table2 t2 ON tempTable.id = t2.id

答案 2 :(得分:0)

insert into one(...) 
select ...
from two t
where not exists (
  select *
  from one x
  where x.id = t.id
  )
  ;

答案 3 :(得分:0)

由于您使用的是Sql 2008,请考虑使用Merge语句 这将插入唯一键

MERGE ONE AS Tar
USING (SELECT Id FROM TWO) AS Sor
ON Tar.Id=Sor.Id
WHEN NOT MATCHED THEN
INSERT(Id)
values(Sor.Id);

这将显示重复的密钥

SELECT B.ID
FROM ONE A
LEFT JOIN TWO B
ON A.ID=B.ID
WHERE B.ID IS NOT NULL