2013-04-24 7 views
0

Интересно, может ли кто-нибудь помочь мне?SQL Копирование значений из одной таблицы в другую, но перемещение дубликатов в другую таблицу

В моей базе данных у меня есть две таблицы, которые имеют одинаковые столбцы и содержат один и тот же тип данных. Моя первая таблица - это та, которую мы поддерживаем в течение последних 6 лет и располагаем несколькими миллионами записей. Моя вторая таблица - та, которую мы получили из других источников, которая содержит более 100 миллионов записей. Вполне вероятно, что некоторые из данных в таблице 2 уже содержатся в таблице 1.

Я пытаюсь добавить уникальные записи из таблицы 2 в таблицу.

My PK одинаково для обеих таблиц, и именно этот столбец идентифицирует, является ли это дубликат или нет.

Проблема заключается в том, что мне нужно показать в конце процесса дубликаты записей, чтобы их можно было пересмотреть.

У меня есть хорошие базовые знания SQL, но недостаточно продвинутые, чтобы достичь этого. Если кто-то может помочь, был бы признателен.

+0

'вставить в один (...), выберите ... из двух т где не существует (выберите * из одного х, где x.id = t.id)' – wildplasser

ответ

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 Server 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 
Смежные вопросы