MySQL选择两个表之间的所有差异?
我从一个电话簿数据库中有3个表,“旧”、“新”和一个“结果”表,它们具有相同的结构和几乎相同的条目MySQL选择两个表之间的所有差异?,mysql,sql,Mysql,Sql,我从一个电话簿数据库中有3个表,“旧”、“新”和一个“结果”表,它们具有相同的结构和几乎相同的条目 old: ID | name | number | email | ... ----+--------------------+--------+-------+----- 1 | foo | 123 | ... 2 | bar | 456 | 3 | entrry with typo
old:
ID | name | number | email | ...
----+--------------------+--------+-------+-----
1 | foo | 123 | ...
2 | bar | 456 |
3 | entrry with typo | 012345 |
4 | John Doe | 123345 |
new:
ID | name | number | email | ...
----+--------------------+--------+-------+-----
1 | foo | 123 | ...
2 | bar | 456 |
3 | entry without typo | 012345 |
4 | John Doe | 12345 |
5 | newly added entry | 09876 |
从这个“新”表中,我想选择与“旧”表不同的所有行,因此结果将是:
result:
ID | name | number | email | ...
----+--------------------+--------+-------+-----
3 | entry without typo | 012345 | ...
4 | John Doe | 12345 |
5 | newly added entry | 09876 |
包括所有已更改数据的条目以及所有未出现在“旧”表中的条目
不仅使其更复杂,这些表中还有大约10列,包括ID、名称、编号、电子邮件和几个标志以及其他信息
是否有最有效的解决方案,或者我必须将每一列与新查询进行比较?您必须对旧记录进行一些比较,以确保正确性,但我认为这是最直接的解决方案 更新我有点困惑,是否要排除所有已更改数据的条目以及所有未出现在“旧”表中的条目。。。所以我添加了where并修改了join子句
insert into result (id, name, number, email, ...)
select new.id, new.name, new.number, new.email, ...
from new
LEFT JOIN old
ON new.ID = old.id
WHERE
old.ID is null
OR
( new.name <> old.name
or
new.number <> old.number
or
new.email <> new.email
...)
这将调出新表中至少有一个its字段与旧表中的等效记录不同的任何记录。假设必须匹配ID才能使比较合法:
select n.*
from new n
left join old o on o.id = n.id
where o.id is null
or not (
and o.name = n.name
and o.number = n.number
and o.email = n.email
and ...)
注意,此解决方案处理某些字段可以为NULL的情况。如果你使用O.No.N.name而不是O.NoNe= N.name,你将不能正确地考虑NULL与非空值的区别。一个高质量的工作将要求你用手工命名/ETC不是一个确定什么是或不存在或者已经改变的可靠的方法…我首先想到的是比较两行的校验和,但是我没有找到一个函数来执行,所以我认为CONCAT也可以工作。所以非常感谢,我仍然无法使用JOIN语法--
select n.*
from new n
left join old o on o.id = n.id
where o.id is null
or not (
and o.name = n.name
and o.number = n.number
and o.email = n.email
and ...)