SQL: дублирующая проверка с использованием нескольких столбцов

#sql #sql-server-2005 #insert #duplicates

#sql #sql-server-2005 #вставить #дубликаты

Вопрос:

Я должен создать:

 INSERT INTO aaa(DateFrom, DateTo)
SELECT DateFrom, DateTo FROM bbb
  

но иногда этот интервал дат уже существует в aaa

Как я должен добавить WHERE в SELECT, чтобы не вставлять в aaa, если этот интервал дат уже существует

Моя проблема заключается в следующем: если я добавлю что-то вроде:

 WHERE bbb.DateFrom NOT IN aaa.DateFrom AND bbb.DateTo NOT IN aaa.DateTo
  

при этом будут проверяться не обе даты (интервал), а даты «От» или «До»

Ответ №1:

Ваша вставка в порядке,

ВСТАВИТЬ В @aaa(DateFrom, DateTo), ВЫБРАТЬ b.DateFrom, b.DateTo ИЗ @bbb b

Вам нужно избавиться от существующего предложения WHERE и вместо этого выполнить соединение ПО ЛЕВОМУ КРАЮ.

ЛЕВОЕ СОЕДИНЕНИЕ @aaa a ДЛЯ a.DateFrom = b.DateFrom И a.DateTo = b.DateTo

Затем вы можете объединить это с новым предложением WHERE для проверки отсутствия записей во второй таблице:

ГДЕ ISNULL(a.DateFrom,») = «

И вуаля, ваш запрос получен!

Полностью проработанный пример ниже:

ОБЪЯВИТЬ ТАБЛИЦУ @aaa ( DateFrom datetime, DateTo datetime )

ВСТАВИТЬ В ЗНАЧЕНИЯ @aaa (DateFrom, DateTo) (’01 января 2011′,’31 января 2011′) ВСТАВИТЬ В ЗНАЧЕНИЯ @aaa(DateFrom, DateTo)(’01 марта 2011′, ’15 марта 2011′)

ВЫБЕРИТЕ * ИЗ @aaa

ОБЪЯВИТЬ ТАБЛИЦУ @bbb ( DateFrom datetime, DateTo datetime )

ВСТАВИТЬ В @bbb (DateFrom, DateTo) ЗНАЧЕНИЯ (’01 января 2011′,’31 января 2011′) ВСТАВИТЬ В @bbb(DateFrom, DateTo) ЗНАЧЕНИЯ (’01 марта 2011′, ’16 марта 2011′) ВСТАВИТЬ В @bbb(DateFrom, DateTo) ЗНАЧЕНИЯ (’01 февраля 2011′, ‘3 июня 2011’)

ВЫБЕРИТЕ * ИЗ @bbb

ВСТАВИТЬ В @aaa(DateFrom, DateTo), ВЫБРАТЬ b.DateFrom, b.DateTo ИЗ @bbb b СЛЕВА ПРИСОЕДИНИТЬСЯ К @aaa a В a.DateFrom = b.DateFrom И a.DateTo = b.DateTo, ГДЕ ISNULL(a.DateFrom,») = «

ВЫБЕРИТЕ * ИЗ @aaa

Ответ №2:

Похоже, все, что вам нужно сделать, это изменить «И» на «ИЛИ» и добавить вложенные инструкции select .

 WHERE bbb.DateFrom NOT IN (select aaa.DateFrom from aaa) AND bbb.DateTo NOT IN (select aaa.DateTo from aaa)
  

Комментарии:

1. это не проверка интервала, что, если есть запись с той же датой, но с другой датой … понимаете, что я имею в виду?

2. Не думаю, что я когда-либо понимал ваш вопрос … не уверен, что понимаю даже сейчас. Рад, что вы нашли свой ответ.