2012-05-29 2 views
3

У меня есть небольшая проблема с введением информации из одной таблицы в другую.Удаление повторяющихся записей, которые существовали бы после вставки

Например: от table A (может содержать ~ 10 кк записей) к table B, таблицы идентичны, за исключением table A имеет DateTimeStamp, который используется для принимать определенные данные (границы).

Поэтому мне нужно переместить данные от А до В (без DateTimeStamp) и удалить дубликаты из B.

Пример:

Таблица A

DateTimeStamp | Key | value 
2012-02-03 | 2 | 123 
2012-02-03 | 3 | 985 
2012-02-03 | 5 | 1584 

Таблица B

Key | value 
    8 | 45 
    3 | 785 
    9 | 7457 

Так что мне нужно удалить строку с Key = 3 от Table B и вставить все остальное от Table A.

Результаты будут:

Key | value 
    8 | 45 
    3 | 985 
    9 | 7457 
    2 | 123 
    5 | 1584 

Есть элегантный способ сделать это? Триггеры слишком медленные, и я ищу решение, которое не требует временной таблицы. Решения

SQL Server или SSIS \ предложения приветствуются

+0

Which ** версия ** в SQL Server ?? 2008 будет иметь команду 'MERGE', которая была бы идеальна для этого сценария –

+0

2008, спасибо за совет, я попробую с MERGE –

+0

OK - см. Мой ответ для образца заявления MERGE –

ответ

3

Если вы используете SQL Server 2008 или новее, вы можете сделать это очень легко с помощью одного MERGE заявления - что-то вроде этого:

MERGE INTO dbo.B    -- target table 
USING A ON b.Key = a.Key  -- source table and "link" information 
WHEN MATCHED 
    THEN UPDATE SET B.Value = A.Value -- if "Key" already present in B - update "Value" 
WHEN NOT MATCHED      -- if "Key" not present in B - insert new row 
    THEN INSERT(TblKey, TblValue) VALUES(A.TblKey, A.TblValue) 
WHEN NOT MATCHED BY SOURCE 
    DELETE        -- if present in B, but not in A -> remove 
; 
+0

Это будет делать вещь :) это только один раз, когда используются 1kk или более записей. –

1

два шага:

-- first delete 
delete tableB 
from tableB b 
inner join tableA a on b.Key = a.Key 

-- then insert 
insert into tableB 
select a.Key, a.Value from tableA a where a.Key not in (select b.Key from tableB b) 
0

Попробуйте это:

Удалить дубликаты из таблицы B:

delete FROM tableB Where tableB.Key IN 
    (select Key 
    from tableA 
    INTERSECT 
    select Key 
    from tableB) 

Затем вставьте в таблицу B:

insert INTO tableB (Key, Value) 
select Key, Value From tableA 
0

хотя все решения здесь представлены, кажется, работают , Я бы действительно собрал пакет с таблицей с 10kk строк.

вы можете использовать oledbsource с запросом aF. предложил:

select a.Key, a.Value 
from tableA a 
where a.Key not in (select b.Key from tableB b) 

и отправить его непосредственно к oledbdestination, указывающий на таблицу В

Смежные вопросы