Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Скопировать только новые строки  [new]
Maximusu
Member

Откуда:
Сообщений: 22
Приветствую друзья.

Есть небольшая проблема.

Есть 2 идентичные по структуре таблицы.
Они - почти клоны за исключением нескольких полей, но 1-я периодически дополняется новыми строками.

Задача состоит в том, чтобы 2-ю таблицу также дополнять этими новыми строками.

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

 INSERT INTO [ExcelAnalysis].[dbo].[ClearDB]
 SELECT * from [ExcelAnalysis].[dbo].[new]
 WHERE parse is NOT NULL


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

Заранее благодарен
4 июн 17, 01:20    [20537601]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать только новые строки  [new]
zby
Member

Откуда:
Сообщений: 36
Maximusu,

Используйте
Not Exists
или
Merge
и будет вам счастье )
4 июн 17, 10:29    [20537751]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать только новые строки  [new]
Василиус
Member

Откуда: Москва
Сообщений: 39
Нашел у себя следующее близкое по теме к вопросу IS NOT NULL:

Предлагается принять за стандарт разработки и во всех changes и sql-скриптах, которые создают/изменяют/удаляют что-либо в БД, по умолчанию использовать предварительную универсальную проверку IF OBJECT_ID ('name') IS NOT NULL на существование объектов в БД (с возможным удалением для пересоздания) в виде:

IF OBJECT_ID ('name') IS NOT NULL
... DROP ...
ALTER ... /ADD ... /CREATE

где 'name' - это может быть название таблицы (t_Card...), представления (vw_card...), хранимой процедуры (sp_acc_get ...) или любого вида индекса (FK_t_ServiceStructure_t_Acc, PK_t_Acc...).

P.S. Использование текущего механизма проверки в виде IF EXISTS (SELECT 1 FROM sys.objects WHERE NAME = 'IX_t_ColumnSize') - видится более громоздким и менее универсальным, т.к. в некоторых случаях, например, ввиду специфики конкретных системных таблиц, к которым идет конкретный SELECT, требуется использование sys.indexes вместо sys.objects, что существенно может затруднять создание sql-скриптов.


Но для проверки наличия определенного СТОЛБЦА (колонки) в таблице, информация о которых не содержится в явном виде при использовании системной функции OBJECT_ID, таки необходимо использовать конструкцию с вложенным запросом к системной таблице sys.columns:

IF EXISTS (SELECT object_id FROM sys.columns WHERE NAME = 'f_ID') AND OBJECT_ID ('dbo.t_RegisterSelectedColumn') IS NOT NULL
... DROP ...
ALTER ... /ADD ... /CREATE


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

IF (SELECT OBJECT_ID ('dbo.t_RegisterSelectedColumn') INTERSECT SELECT OBJECT_ID FROM sys.columns WHERE NAME = 'f_ID') IS NOT NULL
... DROP ...
ALTER ... /ADD ... /CREATE
5 июн 17, 17:26    [20541105]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать только новые строки  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7686
Maximusu,
insert talbe2 (fields...)
select fields...
from table1
where not exists (select * from table2 where table2.key = table1.key)
5 июн 17, 17:49    [20541157]     Ответить | Цитировать Сообщить модератору
 Re: Скопировать только новые строки  [new]
Maximusu
Member

Откуда:
Сообщений: 22
Владислав Колосов,

Спасибо всем, буду пробовать :)
5 июн 17, 22:05    [20541592]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить