sql - 如何在具有相同结构的两个 MySQL 表中选择不同的行?

标签 sql mysql diff

我有两个表,A 和 B,它们具有相同的结构(大约 30 多个字段)。是否有一种简短、优雅的方法来连接这些表并只选择一个或多个列不同的行?我当然可以编写一些脚本来创建包含所有列名的查询,但也许有一个仅限 SQL 的解决方案。

换句话说:是否有一个简短的替代品:

SELECT *
FROM   table_a a
  JOIN table_b b ON a.pkey=b.pkey
WHERE  a.col1 != b.col2
    OR a.col2 != b.col2
    OR a.col3 != b.col3 # .. repeat for 30 columns

最佳答案

考虑到数据,没有捷径可走。事实上,这是唯一的可靠方法。您可能需要注意的一件事是正确比较 NULL-able 列中的 NULL 值。使用 OR 的查询往往很慢,更不用说它是否在 30 列上。

此外,您的查询将不会包含 table_b 中的记录,这些记录在 table_a 中没有对应的记录。所以理想情况下,您会使用 FULL JOIN

如果您需要经常执行此操作,那么您可以引入某种额外的数据列,当行中的任何内容发生变化时,该数据列总是会更新。这可以像在 UPDATE/INSERT 触发器的帮助下更新的 TIMESTAMP 列一样简单。然后当你比较的时候,你甚至知道哪条记录是最近的。但同样,这不是防弹解决方案。

关于sql - 如何在具有相同结构的两个 MySQL 表中选择不同的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2456638/

相关文章:

php - 托管 PHP 应用程序的最佳实践

text - 如何检测具有一定模糊性的重复文本

vim - 如何在 Vim 中为 Mutt 引用的差异着色?

SQL Server 配置管理器 - 无法查看启动模式下拉列表

sql - 寻找丢失的 key

mysql - 在 SQL 查询中使用 Count 和 Max

sql - MySQL 存储过程 : variable in WHERE clause?

c - 使用 bsdiff 作为源文件和目标文件相同的文件。适用于此的其他差异算法?

sql - 一个命令可以执行多个控制文件吗?

sql - 真的可以到处用JOINS代替SQL中的子查询吗