#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. Не думаю, что я когда-либо понимал ваш вопрос … не уверен, что понимаю даже сейчас. Рад, что вы нашли свой ответ.