Как добавить отдельные записи из одной таблицы в другую - PullRequest
2 голосов
/ 21 декабря 2009

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

Ответы [ 6 ]

2 голосов
/ 21 декабря 2009

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

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
1 голос
/ 21 декабря 2009

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

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

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

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

1 голос
/ 21 декабря 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
0 голосов
/ 21 декабря 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
       )

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

0 голосов
/ 21 декабря 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)
0 голосов
/ 21 декабря 2009

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

insert into AnotherTable
(col1, col2, col3)
select distinct col1, col2, col3
from MasterTable
...