#sql-server #not-exists
#sql-сервер #не существует
Вопрос:
Донг SQL INSERT INTO ... SELECT FROM ... WHERE NOT EXISTS
Что на самом деле проверяет это предложение? Я надеюсь вставить результаты col1 из таблицы в ‘col1’ другой таблицы, где его еще нет в этой таблице (т. Е. col1 является первичным ключом)
INSERT INTO <table> (<col1>)
SELECT DISTINCT N.<col1>
FROM N
WHERE NOT EXISTS (
SELECT 1
FROM <table> C
WHERE
N.<col1> = C.<col1>
)
мне кажется, что оператор SELECT в предложении NOT EXISTS либо вернет строку (или более одной строки), и что NOT EXISTS будет искать либо 0 строк, либо более нуля строк.
это правильно?
Комментарии:
1. Он не ищет 0 строк. Он ищет любые строки. если какие-либо строки существуют, то EXISTS оценивается как true. Аналогично, если строк не существует, значение NOT EXISTS оценивается как true.
Ответ №1:
Where not exists не требует пояснений и будет вставлять строки только в том случае, если значение не существует в целевой таблице.
Однако это довольно запутанный синтаксис, и я пытаюсь использовать MERGE
всякий раз, когда мне нужно выполнить какие-либо подобные операции.
Ответ №2:
Просто чтобы добавить к этому, предложение Not Exist можно использовать для выбора или обновления в вашем предложении WHERE, чтобы ИСКЛЮЧИТЬ записи на основе того, что вы определяете в поддерживающем запросе.
В вашем случае СЛИЯНИЕ лучше, но в некоторых случаях, как в примере ниже, это также полезно:
If Not Exists ( Select 1 From dbo.Activities Where ActivityId = 107 AND Activity = 'Facility Updated' )
Begin
Insert Into Activities (ActivityId, Activity, CreateDt_GMT, CreatedBy, TimeZoneOffsetMins, ActionTypeId, IsTracked, IgnoreChildren, ProcessExtraInfomation, IgnoreNotChangedData, ApplicationID)
Values(107, 'Blah', GetDate(), 'SYSTEM', -300, 3, 1, 0, 1, 1, 1 )
End