我对SQL很陌生,所以我使用MySQL工作台,并且我有两个非常大的表(每个表大约900K行),我想比较这些表。请注意,两个表的行数相同。
每个表有16列,我只对比较几个列感兴趣。所以说这些表有DataID,a,b,c,d,e列,我想看看基于DataID的每一行的表c和表B中列c,d和e的值是否相同。
在每个表中,我有一个DataID列,它为比较每个表中的行提供了一个参考点,所以例如我想比较表A中的DataID = 444的行和表中具有相同DataID的行B并查看我感兴趣的列是否相同。
对于所有900k行,必须重复该过程,如果我能在某处写出结果,我想这会有所帮助。
如果我有任何帮助,我将不胜感激,如果我太困惑,我很乐意回答任何问题。
答案 0 :(得分:3)
首先,要返回具有相同DataID且在c,d,e中具有所有相同值的行表,请使用以下查询:
SELECT
t1.c, t2.c, t1.d, t2.d, t1.e, t2.e
FROM
table1 t1
INNER JOIN
table2 t2 ON t1.DataId = t2.DataId
WHERE
t1.c = t2.c AND t1.d = t2.d
AND t1.e = t2.e
如果您希望表中任何值(c,d或e)相同,请使用t1.c = t2.c or t1.d = t2.d or t1.e = t2.e
子句中的WHERE
。
要获取包含所有不同值的表,请在WHERE
子句t1.c <> t2.c AND t1.d <> t2.d AND t1.e <> t2.e
中使用以下内容
要获得任何值不同的表,请使用WHERE
子句t1.c <> t2.c OR t1.d <> t2.d OR t1.e <> t2.e
中的以下内容
要保存结果,请使用以下查询:
INSERT INTO SaveTable SELECT
t1.c, t2.c, t1.d, t2.d, t1.e, t2.e
FROM
table1 t1
INNER JOIN
table2 t2 ON t1.DataId = t2.DataId
WHERE
t1.c <> t2.c AND t1.d <> t2.d AND t1.e <> t2.e
要在其他情况下添加插入值,只需修改where子句和select
子句中的just值。
答案 1 :(得分:1)
如果我正确理解它,您只需要那些DataID,c,d和e列具有相同值的记录。 在这种情况下,以下语句将为您提供结果:
SELECT TableA.DataID,
TableA.c,
TableA.d,
TableA.e
-- add any other columns to the selection list if needed
INTO result_table
FROM TableA
INNER JOIN TableB
ON TableA.DataID = TableB.DataID
WHERE TableA.c = TableB.c
AND TableA.d = TableB.d
AND TableA.e = TableB.e
据我所知,没有比使用简单的INNER JOIN语句解决这个问题更好的方法(从性能的角度来看)。 假设DataID是TableA和TableB中的主键,它甚至应该在大型数据集上快速。
答案 2 :(得分:0)
您可以使用内部联接来比较数据
一个小片段就是
SELECT table_A.a, table_B.a, ......
FROM table_A
INNER JOIN table_B
ON table_A.DataID = table_B.DataID;
答案 3 :(得分:0)
您可以大量简化此任务,但您将阅读许多数据。如果没问题,只需执行2个SELECT,然后计算它们的MD5。然后你可以比较MD5。
从Linux上的命令行客户端获取Md5非常简单:
\P md5sum
SELECT ...
通过一个程序做一点时间,但毕竟,你只需要2个循环。