Как добавить только отдельные записи из главной таблицы в другую таблицу, когда в главной таблице могут быть дубликаты. Пример. Мне нужны только отдельные записи в меньшей таблице, но мне нужно вставлять/добавлять записи к тому, что у меня уже есть в меньшей таблице.
Как добавить отдельные записи из одной таблицы в другую
Ответы (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
Если вам не нравятся 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
Вы не говорите масштаб проблемы, поэтому я упомяну то, с чем недавно помог другу.
Он работает в страховой компании, которая предоставляет дополнительные услуги по управлению льготами в области стоматологии и зрения для других страховых компаний. Когда они получают нового клиента, они также получают новую базу данных, которая может содержать десятки миллионов записей. Они хотели идентифицировать все возможные дубликаты с данными, которые у них уже были в главной базе данных из сотен миллионов записей.
Решение, к которому мы пришли, состояло в том, чтобы идентифицировать две различные комбинации значений полей (нормализованных различными способами), которые указывали бы на высокую вероятность обмана. Затем мы создали новую таблицу, содержащую хэши MD5 комбинаций плюс идентификатор основной записи, к которой они применялись. Столбцы MD5 были проиндексированы. Для всех новых записей будут вычисляться их комбинированные хэши, и если какая-либо из них столкнется с мастером, новая запись будет удалена в файл исключений, чтобы какой-то человек мог с ней справиться.
Скорость этого чертовски удивила нас (в хорошем смысле), и у него был очень приемлемый уровень ложноположительных результатов.
Вы можете использовать ключевое слово distinct
для фильтрации дубликатов:
insert into AnotherTable
(col1, col2, col3)
select distinct col1, col2, col3
from MasterTable
На основе 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)
Что-то вроде этого будет работать для 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
)
Настройте, где это уместно, в зависимости от того, что именно определяет «отличительность» для вашей таблицы.