Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL选择两个表之间的所有差异?_Mysql_Sql - Fatal编程技术网

MySQL选择两个表之间的所有差异?

MySQL选择两个表之间的所有差异?,mysql,sql,Mysql,Sql,我从一个电话簿数据库中有3个表,“旧”、“新”和一个“结果”表,它们具有相同的结构和几乎相同的条目 old: ID | name | number | email | ... ----+--------------------+--------+-------+----- 1 | foo | 123 | ... 2 | bar | 456 | 3 | entrry with typo

我从一个电话簿数据库中有3个表,“旧”、“新”和一个“结果”表,它们具有相同的结构和几乎相同的条目

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