SQL: проверка на дублирование с использованием нескольких столбцов - PullRequest
1 голос
/ 12 апреля 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

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

INSERT INTO @aaa (DateFrom, DateTo) ВЫБРАТЬ b.DateFrom, b.DateTo FROM @bbb b

Вам необходимоизбавьтесь от существующего предложения WHERE и выполните вместо этого левое соединение.

левое соединение @aaa a ON a.DateFrom = b.DateFrom AND a.DateTo = b.DateTo

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

WHERE ISNULL (a.DateFrom, '') = ''

И вуаля, у вас есть запрос!

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

ОБЪЯВИТЬ @aaa TABLE (DateFrom datetime, DateTo datetime)

INSERT INTO @aaa (DateFrom, DateTo) VALUES ('01 Jan 2011 ',' 31.01.2011 ') INSERT INTO @aaa (DateFrom, DateTo) VALUES ('01 Mar 2011', '15 Mar 2011')

ВЫБРАТЬ * ОТ @ aaa

ОБЪЯВИТЬ @bbb TABLE (DateFrom datetime, DateTo datetime)

INSERT INTO @bbb (DateFrom, DateTo) VALUES ('01 Jan 2011 ',' 31 Jan2011 ') ВСТАВИТЬINTO @bbb (DateFrom, DateTo) VALUES ('01 Mar 2011 ',' 16 Mar 2011 ') INSERT INTO @bbb (DateFrom, DateTo) VALUES ('01 Feb 2011', '3 Jun 2011')

SELECT * FROM @ bbb

INSERT INTO @aaa (DateFrom, DateTo) SELECT b.DateFrom, b.DateTo FROM @bbb b СЛЕВАЯ СОЕДИНЕНИЕ @aaa a ON a.DateFrom = b.DateFrom AND a.DateTo= b.DateTo WHERE ISNULL (a.DateFrom, '') = ''

SELECT * FROM @ aaa

0 голосов
/ 12 апреля 2011

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

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