#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.