我是MySQL用户。我有两个问题,我希望比较他们的结果是否相等。我想用一个返回true或false的查询来执行此操作,因此我的两个查询中的每一个都很可能采用子查询的形式。
我希望避免从两个查询返回结果并在应用程序级别比较它们,以减少通信并提高性能。如果可能的话,我还想避免在数据库级别循环结果,但如果没有别的办法,那就这样吧。
我已经搜索过高低的例子来说明如何做到这一点,但空手而归。一些示例代码将非常受欢迎,因为我是SQL编程的新手。谢谢!
注意:我正在寻找一个适用于任意两个任意查询的解决方案,因此我将避免发布我的两个查询恰好是什么。
答案 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 );