Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
zby Member Откуда: Мск Сообщений: 53 |
Maximusu, Используйте Not Existsили
Merge
и будет вам счастье )
|
4 июн 17, 10:29 [20537751] Ответить | Цитировать Сообщить модератору |
Василиус 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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8353 |
Maximusu,insert talbe2 (fields...) select fields... from table1 where not exists (select * from table2 where table2.key = table1.key) |
5 июн 17, 17:49 [20541157] Ответить | Цитировать Сообщить модератору |
Maximusu Member Откуда: Сообщений: 22 |
Владислав Колосов, Спасибо всем, буду пробовать :) |
5 июн 17, 22:05 [20541592] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |