比较mysql中两个表之间的差异

ech*_*aze 59 mysql sql

oracle diff相同:如何比较两个表?除了在mysql中.

假设我有两个表,t1和t2,它们的布局相同但可能包含不同的数据.

区分这两个表的最佳方法是什么?

更精确地说,我试图找出一个简单的SQL查询,告诉我,如果从T1一行数据从不同的数据在T2相应的行

看来我不能使用交叉或减号.当我尝试

SELECT * FROM robot intersect SELECT * FROM tbd_robot
Run Code Online (Sandbox Code Playgroud)

我收到一个错误代码:

[错误代码:1064,SQL状态:42000]您的SQL语法中有错误; 查看与您的MySQL服务器版本对应的手册,以便在第1行的'SELECT*FROM tbd_robot'附近使用正确的语法

我在语法上做错了吗?如果没有,我可以使用另一个查询吗?

编辑:另外,我正在通过免费版DbVisualizer查询.不确定这可能是一个因素.

Qua*_*noi 73

INTERSECT需要仿效MySQL:

SELECT  'robot' AS `set`, r.*
FROM    robot r
WHERE   ROW(r.col1, r.col2, …) NOT IN
        (
        SELECT  *
        FROM    tbd_robot
        )
UNION ALL
SELECT  'tbd_robot' AS `set`, t.*
FROM    tbd_robot t
WHERE   ROW(t.col1, t.col2, …) NOT IN
        (
        SELECT  *
        FROM    robot
        )
Run Code Online (Sandbox Code Playgroud)

编辑:在单词周围添加`:set

  • 知道怎么做而不必写每个字段吗? (4认同)
  • @Veve:你做不到 (2认同)
  • 谢谢你,先生!您使我无需通过 200 万条记录来查找 2 个表之间的差异。 (2认同)

Roe*_*ler 66

您可以使用UNION手动构建交叉点.如果您在两个表中都有一些唯一字段,例如ID,则很容易:

SELECT * FROM T1
WHERE ID NOT IN (SELECT ID FROM T2)

UNION

SELECT * FROM T2
WHERE ID NOT IN (SELECT ID FROM T1)
Run Code Online (Sandbox Code Playgroud)

如果您没有唯一值,您仍然可以展开上面的代码来检查所有字段而不仅仅是ID,并使用AND来连接它们(例如ID NOT IN(...)AND OTHER_FIELD NOT IN(. ..)等)

  • 很棒的答案. (3认同)
  • 优雅的解决方案,@Roee Adler! (2认同)

Hai*_*vgi 8

我在此链接中找到了另一种解决方案

SELECT MIN (tbl_name) AS tbl_name, PK, column_list
FROM
 (
  SELECT ' source_table ' as tbl_name, S.PK, S.column_list
  FROM source_table AS S
  UNION ALL
  SELECT 'destination_table' as tbl_name, D.PK, D.column_list
  FROM destination_table AS D 
)  AS alias_table
GROUP BY PK, column_list
HAVING COUNT(*) = 1
ORDER BY PK
Run Code Online (Sandbox Code Playgroud)


小智 6

 select t1.user_id,t2.user_id 
 from t1 left join t2 ON t1.user_id = t2.user_id 
 and t1.username=t2.username 
 and t1.first_name=t2.first_name 
 and t1.last_name=t2.last_name
Run Code Online (Sandbox Code Playgroud)

试试这个.这将比较您的表并找到所有匹配的对,如果任何不匹配在左侧返回NULL.

  • 如果 t2 有其他记录也不存在于 t1 中,那么此查询不会错过这些记录吗? (2认同)