SQL: что на самом деле проверяет ‘ГДЕ НЕ СУЩЕСТВУЕТ’?

#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