检查两个“选择”是否相同

时间:2011-04-20 09:02:39

标签: sql oracle select

有没有办法检查两个(非平凡)选择是否相同?

最初我希望两个选项之间有正式的等价,但答案是 proving-sql-query-equivalency阻止我。

根据我的实际需要,我可以检查两个选项的(实际)结果是否相同。

4 个答案:

答案 0 :(得分:32)

如果要比较查询结果,请尝试以下操作:

(select * from query1 MINUS select * from query2) 
UNION ALL
(select * from query2 MINUS select * from query1)

这将导致只有一个查询返回的所有行。

答案 1 :(得分:9)

无法对HAL9000给出的答案发表评论,我想要注意MINUS不是标准的SQL而且它在postgresql下不起作用 所以我们需要使用EXCEPT而不是

(select * from query1 EXCEPT select * from query2) 
UNION ALL
(select * from query2 EXCEPT select * from query1)

答案 2 :(得分:2)

对于

(select * from query1 EXCEPT select * from query2)
 UNION ALL 
(select * from query2 EXCEPT select * from query1)

我在postgres 9.4上做了一些试验,这是我的结果。

[1]不支持减号,因此需要使用@Bogdan所说的EXCEPT

[2]仅使用EXCEPT不会考虑重复,因此必须使用EXCEPT ALL

[3] EXCEPT ALL要求结果中的列顺序应该相同 上面的查询QUERY1QUERY2应该返回相同的列顺序,或者我们必须包装查询并确保列顺序相同。(可能在应用程序逻辑中发生这种情况)

所以我认为如果我们记住3点以上,我们可能100%确定给定数据集上的两个查询返回的数据完全相同。

如果我遇到可能失败的更多边缘案例,

将更新。

答案 3 :(得分:0)

运行它们并比较结果。使用EXCEPT操作从第二个查询返回的集合中减去第一个查询返回的集合。如果结果是空集,那么它们是等价的。

此方法的问题在于它不能证明两个查询对于任何数据库都是等效的。这取决于您的数据库的内容。例如,如果您的数据库为空,则根据此方法,任何两个select语句都是等效的。

通过分析查询证明等效是一个未解决的问题AFAIK(但我不是一个数据库理论大师,所以不要相信我;)) 另外,您可以查看此问题:Proving SQL query equivalency