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

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


person sql_rookie    schedule 21.12.2009    source источник
comment
Добро пожаловать в StackOverflow! Отличный первый вопрос.   -  person Sampson    schedule 21.12.2009
comment
Какую систему баз данных вы используете? MySQL, SQLServer?   -  person Sampson    schedule 21.12.2009


Ответы (6)


Игнорирование любых проблем параллелизма:

insert into smaller (field, ... )
select distinct field, ... from bigger
except
select field, ... from smaller;

Вы также можете перефразировать это как соединение:

insert into smaller (field, ... )
select distinct b.field, ... 
from bigger b
left join smaller s on s.key = b.key
where s.key is NULL
person Remus Rusanu    schedule 21.12.2009

Если вам не нравятся NOT EXISTS и EXCEPT/MINUS (милый, Ремус!), у вас также есть LEFT JOIN решение:

INSERT INTO smaller(a,b)
SELECT DISTINCT master.a, master.b FROM master
LEFT JOIN smaller ON smaller.a=master.a AND smaller.b=master.b
WHERE smaller.pkey IS NULL
person Community    schedule 21.12.2009

Вы не говорите масштаб проблемы, поэтому я упомяну то, с чем недавно помог другу.

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

Решение, к которому мы пришли, состояло в том, чтобы идентифицировать две различные комбинации значений полей (нормализованных различными способами), которые указывали бы на высокую вероятность обмана. Затем мы создали новую таблицу, содержащую хэши MD5 комбинаций плюс идентификатор основной записи, к которой они применялись. Столбцы MD5 были проиндексированы. Для всех новых записей будут вычисляться их комбинированные хэши, и если какая-либо из них столкнется с мастером, новая запись будет удалена в файл исключений, чтобы какой-то человек мог с ней справиться.

Скорость этого чертовски удивила нас (в хорошем смысле), и у него был очень приемлемый уровень ложноположительных результатов.

person Peter Rowell    schedule 21.12.2009
comment
Вау, никогда не думал об этом таким образом! очень аккуратно - person Rippo; 21.12.2009

Вы можете использовать ключевое слово distinct для фильтрации дубликатов:

insert into AnotherTable
(col1, col2, col3)
select distinct col1, col2, col3
from MasterTable
person Andomar    schedule 21.12.2009

На основе Microsoft SQL Server и его Transact-SQL. Как всегда, не проверено, и таблица target_table имеет такое же количество строк, что и исходная таблица (в противном случае используйте имена столбцов между INSERT INTO и SELECT).

INSERT INTO target_table
  SELECT DISTINCT row1, row2
  FROM source_table
  WHERE NOT EXISTS(
    SELECT row1, row2
    FROM target_table)
person Scoregraphic    schedule 21.12.2009

Что-то вроде этого будет работать для SQL Server (вы не указываете, какую СУБД вы используете):

INSERT INTO table (col1, col2, col3)
    SELECT DISTINCT t2.a, t2.b, t2.c 
       FROM table2 AS t2
       WHERE NOT EXISTS (
          SELECT 1 
             FROM table 
             WHERE table.col1 = t2.a AND table.col2 = t2.b AND table.col3 = t2.c
       )

Настройте, где это уместно, в зависимости от того, что именно определяет «отличительность» для вашей таблицы.

person Chris J    schedule 21.12.2009