Копирование содержимого из 1 таблицы в другую, за исключением совпадающих записей

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть вопрос о выполнении определенного типа запроса. Вот пример: у меня есть 2 таблицы X и Y

 Table X
1@abc.com
2@abc.com
3@abc.com
  

Теперь я хочу переместить ВСЕ в таблицу Y.
Итак, теперь таблица Y выглядит точно так же, как таблица X

Теперь я удаляю все из таблицы X, за исключением 1@abc.com Итак, новая таблица X выглядит следующим образом:

 Table X
1@abc.com
  

Допустим, я сделал это случайно, и теперь я хочу переместить все из таблицы Y обратно в X, за исключением совпадающих записей (которые в данном случае будут 1@abc.com )

Как бы я поступил по этому поводу?

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

1. lol.. Нет. Я ничего не могу удалить, поскольку это производственная среда. Очевидно, что мой пример упрощен, поэтому я действительно ищу здесь логику.

2. @John K. — Операционная система присоединилась 20 дней назад. Дайте ему передохнуть.

3. спасибо, Oded. Теперь я научился принимать ответы. Я позабочусь об этом 0% 🙂

4. спасибо за отзыв, джакобсон. Я начну эту практику в дальнейшем.

Ответ №1:

Вы можете использовать EXCEPT оператор отношения:

 INSERT INTO X
SELECT * FROM Y
  EXCEPT 
SELECT * FROM X
  

Также существуют дополнительные INTERSECT и гораздо более известные UNION операторы.

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

1. (ВЫБЕРИТЕ * Из Y) КРОМЕ (ВЫБЕРИТЕ * ИЗ X)?

2. @Will A — Да… Я был слишком быстр 😉

Ответ №2:

Для этого должно быть что-то близкое к приведенному ниже. Следите за нулевыми значениями — вам нужно убедиться, что условия в ЛЕВОМ соединении соответствуют этим.

 INSERT INTO X
SELECT *
FROM Y
LEFT JOIN X
ON X.field1 = Y.field1
AND X.field2 = Y.field2
AND ...
WHERE X.field1 IS NULL
  

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

1. …Ответ Oded требует гораздо меньших усилий. 🙂

2. @Ray — в будущем, пожалуйста, указывайте версии в своем вопросе.

Ответ №3:

Почему бы не удалить все в таблице X, а затем просто скопировать все из таблицы Y обратно в таблицу X?

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

1. Смотрите мой комментарий выше. В основном, производственная среда. Таким образом, удаления не допускаются.

2. итак … тогда как данные таблицы x были удалены? 😉

Ответ №4:

Вам нужно ключевое слово EXCEPT

 INSERT TableX
SELECT * FROM TableY
EXCEPT
SELECT ID FROM TABLEX
  

Ответ №5:

Сначала я сделаю одно предположение для простоты демонстрации решения. Это предположение просто заключается в том, что X и Y имеют столбец первичного ключа с именем id.

 INSERT INTO X (id, col1, col2, ...col(n))
   SELECT Y.id, Y.col1, Y.col2, ...Y.col(n)
   FROM Y
   LEFT OUTER JOIN X
   ON X.id = Y.id
   WHERE X.id is NULL;
  

Этот метод вставляет недостающие строки в X из Y. Хороший пример этого можно найти в книге Кэти Келленбергер «Начало T-SQL 2008«, страницы 190-191.