2013-04-24 171 views
0

我想知道是否有人可以帮助我?SQL将表中的值从一个表复制到另一个表,但将副本移动到另一个表

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

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

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

问题出现了,我需要在过程结束时显示重复记录,以便可以检查这些记录。

我对SQL有一个很好的基础知识,但没有达到这个目标。 如果任何人能够协助它,将不胜感激。

+0

'insert into one(...)select ... from two t where where exists(select * from one x where x.id = t.id)' – wildplasser 2013-04-24 11:35:57

回答

0

请尝试:

INSERT INTO Table1 
SELECT DISTINCT * FROM Table1 
WHERE PrimaryKeyColumn NOT IN (SELECT PrimaryKeyColumn from Table1) 
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 
0
insert into one(...) 
select ... 
from two t 
where not exists (
    select * 
    from one x 
    where x.id = t.id 
) 
    ; 
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); 

this将显示重复键

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