2009-01-10 62 views

回答

1

你也可以使用一个左外连接(第一告诉你在哪里在表中存在行,否B,第二反之亦然):

SELECT a.id FROM a LEFT JOIN b ON a.id = b.id WHERE b.id IS NULL 
SELECT b.id FROM b LEFT JOIN a ON b.id = a.id WHERE a.id IS NULL 
1
SELECT DISTINCT id FROM a WHERE NOT EXISTS (SELECT * FROM b WHERE a.id = b.id); 
SELECT DISTINCT id FROM b WHERE NOT EXISTS (SELECT * FROM a WHERE a.id = b.id); 
7

无论答案公布到目前为止(来自BrynJ和Vadim)做了非常彻底的工作。做彻底的工作也非常困难。两个答案都假设知道每个表中存在哪些ID号就足够了。但是,一般来说,表格有多个列。

让我们把表A和B.

的一个重要问题是“两代表具有相同的架构”?如果没有,那么一个问题是哪些列需要被添加到A,哪些列需要被添加到B以使他们的模式相同。这是一个元数据查询,可以从系统目录中得到答复。添加到表中的列应插入哪些值是一个有趣的问题。

我们假设这些表实际上具有相同的模式,包括相同的主键和列之间相同的功能依赖关系。我们还假设有一个ID列(存储唯一的整数),Name列(一个字符串)和一个DATE类型的RefDate列。

Table A         Table B 
ID Name   RefDate    ID Name   RefDate 
1 Frederick 2007-01-23    1 Josephine 2009-01-10 

现在,需要从每个表中插入,删除,更新以使它们相同?

我认为可以公平地说,如果不知道更多的上下文,就没有单一的答案。这可能是弗雷德里克自2007年以来经历了性别改变手术,而B中的入门代表了她的新身份。或者它可能是一个错误;数据库不应该同时存储这些记录。或者可能有另一个解决方案。

不幸的是,来自BrynJ和Vadim的询问都表明A和B之间没有区别,这对我来说是一个可疑的命题。

顺便提一句,请注意,比较行可能有空位时的行比它们没有时更复杂。例如,考虑比较名称:

没有空值:

(A.Name = B.Name) 

用null:

(A.Name = B.Name OR (A.Name IS NULL AND B.Name IS NULL)) 

一个理由回避空值时,您可以。

相关问题