在MySQL中的表之间计算差异(在某种意义上应该从一个表添加和删除哪些内容以获得另一个表)的好方法是什么?
答案 0 :(得分: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)
使用nulls:
(A.Name = B.Name OR (A.Name IS NULL AND B.Name IS NULL))
尽可能避免空值的另一个原因。
答案 1 :(得分: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);
答案 2 :(得分:1)
您也可以使用左外连接(第一个告诉您表a中存在行而不是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