与oracle diff: how to compare two tables?相同,但mysql除外。
假设我有两个表,t1和t2,它们的布局相同但可能包含不同的数据。
区分这两个表的最佳方法是什么?
更确切地说,我正在试图找出一个简单的SQL查询,它告诉我t1中一行的数据是否与t2中相应行的数据不同
看来我不能使用交叉或减号。当我尝试
SELECT * FROM robot intersect SELECT * FROM tbd_robot
我收到错误代码:
[错误代码:1064,SQL状态:42000]您的SQL中有错误 句法;查看与MySQL服务器版本对应的手册 在第1行的“SELECT * FROM tbd_robot”附近使用正确的语法
我在语法上做错了什么吗?如果没有,我可以使用另一个查询吗?
编辑:此外,我正在通过免费版DbVisualizer查询。不确定这可能是一个因素。
答案 0 :(得分: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
)
编辑:在单词周围添加`:set
答案 1 :(得分:64)
您可以使用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)
如果您没有唯一值,您仍然可以展开上面的代码来检查所有字段而不仅仅是ID,并使用AND来连接它们(例如ID NOT IN(...)AND OTHER_FIELD NOT IN(...)等)
答案 2 :(得分:8)
我在此link
中找到了另一种解决方案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
答案 3 :(得分: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
试试这个。这将比较您的表并找到所有匹配的对,如果任何不匹配在左侧返回NULL。
答案 4 :(得分:3)
根据Haim的回答,我创建了一个PHP代码来测试和显示两个数据库之间的所有差异。 如果源数据库或测试数据库中存在表,也会显示此信息。 您必须更改详细信息<>变量内容。
english_header = soup.find('span', {'id': 'English', 'class': 'mw-headline'})
if english_header:
next_sibling = english_header.parent.find_next_sibling()
while next_sibling and not (next_sibling.name == 'h2' and next_sibling.select('.mw-headline')):
for element in next_sibling.select('.IPA'):
print(element)
next_sibling = next_sibling.find_next_sibling()
答案 5 :(得分:0)
基于Haim的答案,如果您要比较两个表中存在的值,那么这是一个简化的示例,否则,如果一个表中有一行,而另一表中没有一行,它将返回它。...
花了我几个小时才弄清楚。这是一个经过全面测试的简单查询,用于比较“ tbl_a”和“ tbl_b”
SELECT ID, col
FROM
(
SELECT
tbl_a.ID, tbl_a.col FROM tbl_a
UNION ALL
SELECT
tbl_b.ID, tbl_b.col FROM tbl_b
) t
WHERE ID IN (select ID from tbl_a) AND ID IN (select ID from tbl_b)
GROUP BY
ID, col
HAVING COUNT(*) = 1
ORDER BY ID
因此,您需要添加额外的“ where in”子句:
ID IN(从tbl_a中选择ID)和ID IN(从tbl_b中选择ID)在哪里
也:
为便于阅读,如果您想指出表名,可以使用以下命令:
SELECT tbl, ID, col
FROM
(
SELECT
tbl_a.ID, tbl_a.col, "name_to_display1" as "tbl" FROM tbl_a
UNION ALL
SELECT
tbl_b.ID, tbl_b.col, "name_to_display2" as "tbl" FROM tbl_b
) t
WHERE ID IN (select ID from tbl_a) AND ID IN (select ID from tbl_b)
GROUP BY
ID, col
HAVING COUNT(*) = 1
ORDER BY ID
答案 6 :(得分:0)
下面的问题是比较我进行大更新之前和之后的表!
如果使用 Linux ,则可以使用以下命令:
在终端
mysqldump -hlocalhost -uroot -p schema_name_here table_name_here > /home/ubuntu/database_dumps/dump_table_before_running_update.sql
mysqldump -hlocalhost -uroot -p schema_name_here table_name_here > /home/ubuntu/database_dumps/dump_table_after_running_update.sql
diff -uP /home/ubuntu/database_dumps/dump_some_table_after_running_update.sql /home/ubuntu/database_dumps/dump_table_before_running_update.sql > /home/ubuntu/database_dumps/diff.txt
您将需要在线工具用于
例如http://www.dpriver.com/pp/sqlformat.htm [不是我见过的最好的]
我们有 diff.txt ,您必须手动采用+-显示在内部,即1行插入语句中的值。
在线比较 diff.txt 中的两行-&+,将其放在在线差异工具中
例如https://www.diffchecker.com [您可以保存和共享它,并且文件大小没有限制!]
注意:如果其敏感/生产数据非常小心!