将内容从1个表复制到另一个表中,但匹配记录除外

时间:2011-04-28 18:54:02

标签: sql sql-server

我对运行特定类型的查询有疑问。 这是一个例子:我有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)

我该怎么做?

5 个答案:

答案 0 :(得分:10)

您可以使用EXCEPT关系运算符:

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

还有互补的INTERSECT和更为人熟知的UNION运营商。

答案 1 :(得分:3)

接近下面的东西应该这样做。但是要注意NULL - 你需要确保LEFT JOIN上的条件能够应对这些条件。

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

答案 2 :(得分:1)

为什么不删除表X中的所有内容,然后只需将表Y中的所有内容复制回表X?

答案 3 :(得分:1)

您需要EXCEPT关键字

INSERT TableX
SELECT * FROM TableY
EXCEPT
SELECT ID FROM TABLEX

答案 4 :(得分:0)

首先,我将做一个假设,以便于演示解决方案。这个假设只是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;

此方法将缺少的行从Y插入到X中。有关这方面的一个很好的示例,请参阅Kathi Kellenberger撰写的本书 Beginning T-SQL 2008 ,第190-191页。