Вставка SQL в использование Union должна добавлять только различные значения - PullRequest
5 голосов
/ 15 февраля 2012

Итак, у меня есть временная таблица, которая имеет такую ​​структуру:

col1    col2    col3    col3
intID1  intID2  intID3  bitAdd

Я делаю объединение значений этой временной таблицы с запросом выбора и сохранением это в той же временной таблице. Дело в том, что col3 не является частью запроса объединения, я буду позже потребуется обновить таблицу.

Итак, я делаю так:

Insert into  #temptable
(
intID1,
intID2,
intID3
)
select intID1,intID2,intID3
From
#temptable

UNION

select intID1,intID2,intID3
From
Table A

Проблема в том, что я хочу, чтобы были добавлены только те строки, которые еще не существуют во временной таблице. При таком способе будет добавлена ​​копия уже существующей строки (поскольку union вернет одну строку). Как вставить только те строки, которых нет в текущей временной таблице в моем запросе объединения?

Ответы [ 3 ]

9 голосов
/ 15 февраля 2012

Использование MERGE:

MERGE INTO #temptable tmp
USING (select intID1,intID2,intID3 From Table A) t
ON (tmp.intID1 = t.intID1 and tmp.intID2 = t.intID2 and tmp.intID3 = t.intID3)
WHEN NOT MATCHED THEN
INSERT (intID1,intID2,intID3)
VALUES (t.intID1,t.intID2,t.intID3)
7 голосов
/ 15 февраля 2012

Красиво и просто с EXCEPT

INSERT INTO  #temptable (intID1, intID2, intID3)
SELECT intID1,intID2,intID3 FROM TableA
EXCEPT
SELECT intID1,intID2,intID3 FROM #temptable
0 голосов
/ 16 февраля 2012

Я вижу, откуда ты.В большинстве языков программирования #temptable будет переменной (переменная отношения или сокращенно relvar), которой вы бы присвоили значение (значение отношения), таким образом:

#temptable := #temptable UNION A

В реляционной модели это будетдостичь желаемого результата, потому что отношение не имеет повторяющихся строк по определению.

Однако SQL не является действительно реляционным и не поддерживает присваивание.Вместо этого вам необходимо добавить строки в таблицу, используя операторы SQL DML INSERT (что не так уж и плохо: пользователи действительно языка реляционной базы данных, если бы он у нас был, без сомнения, потребовали бы аналогичного сокращения для реляционного присваивания!) но вы также должны сделать тест на дубликаты самостоятельно.

Ответы Даниэля Хилгарта и Иоахима Исакссона выглядят неплохо.Хорошей практикой является наличие двух хороших, логически обоснованных ответов-кандидатов, а затем поиск критериев (как правило, производительности при типичной нагрузке), чтобы исключить один (но оставив его закомментированным для будущего повторного тестирования!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...