如何在MySQL中比较两个查询结果的相等性?

时间:2011-07-08 15:53:31

标签: mysql sql database comparison subquery

我是MySQL用户。我有两个问题,我希望比较他们的结果是否相等。我想用一个返回true或false的查询来执行此操作,因此我的两个查询中的每一个都很可能采用子查询的形式。

我希望避免从两个查询返回结果并在应用程序级别比较它们,以减少通信并提高性能。如果可能的话,我还想避免在数据库级别循环结果,但如果没有别的办法,那就这样吧。

我已经搜索过高低的例子来说明如何做到这一点,但空手而归。一些示例代码将非常受欢迎,因为我是SQL编程的新手。谢谢!

注意:我正在寻找一个适用于任意两个任意查询的解决方案,因此我将避免发布我的两个查询恰好是什么。

3 个答案:

答案 0 :(得分:13)

SELECT
  CASE WHEN count1 = count2 AND count1 = count3 THEN 'identical' ELSE 'mis-matched' END
FROM
(
  SELECT
    (SELECT COUNT(*) FROM <query1>) AS count1,
    (SELECT COUNT(*) FROM <query2>) AS count2,
    (SELECT COUNT(*) FROM (SELECT * FROM query1 UNION SELECT * FROM query2) AS unioned) AS count3
)
  AS counts

答案 1 :(得分:3)

如果MySQL支持FULL OUTER JOIN,这会更容易一点,如果这两个查询给出的结果相同,但顺序不同,则会被认为是等价的

SELECT 
  COUNT(*) 
FROM 
(
    (SELECT A, b, c FROM A) a
    LEFT OUTER JOIN 
      (SELECT A, b, c FROM b) B
    ON A.a = b.a and a.b = b.b and a.c = b.c
UNION 
    (SELECT A, b, c FROM A) a
   RIGHT OUTER JOIN 
   (SELECT A, b, c FROM b) B
    ON A.a = b.a and a.b = b.b and a.c = b.c
) 
WHERE a.a is null or b.a is null

如果count = 0,那么两个查询是相同的

另外因为我正在使用UNION重复项被删除。因此那里存在潜在的不准确性。

答案 2 :(得分:3)

你不能在MySQL中做MINUS,所以这里是如何做到的:

select if(count(*)=0,'same','different') from (
select col1,col2,col3
from tableone
where ( col1, col2, col3 ) not in
( select col4, col5, col6
  from tabletwo )
union
select col4, col5, col6
from tabletwo
where ( col4, col5, col6 ) not in
( select col1, col2, col3
  from tableone )
) minusintersec;

这是给出的:

tableone (col1 integer, col2 integer, col3 integer );

tabletwo (col4 integer, col5 integer, col6 integer );