有没有办法检查两个(非平凡)选择是否相同?
最初我希望两个选项之间有正式的等价,但答案是 proving-sql-query-equivalency阻止我。
根据我的实际需要,我可以检查两个选项的(实际)结果是否相同。
答案 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
要求结果中的列顺序应该相同
上面的查询QUERY1
和QUERY2
应该返回相同的列顺序,或者我们必须包装查询并确保列顺序相同。(可能在应用程序逻辑中发生这种情况)
所以我认为如果我们记住3点以上,我们可能100%确定给定数据集上的两个查询返回的数据完全相同。
如果我遇到可能失败的更多边缘案例,将更新。
答案 3 :(得分:0)
运行它们并比较结果。使用EXCEPT操作从第二个查询返回的集合中减去第一个查询返回的集合。如果结果是空集,那么它们是等价的。
此方法的问题在于它不能证明两个查询对于任何数据库都是等效的。这取决于您的数据库的内容。例如,如果您的数据库为空,则根据此方法,任何两个select语句都是等效的。
通过分析查询证明等效是一个未解决的问题AFAIK(但我不是一个数据库理论大师,所以不要相信我;)) 另外,您可以查看此问题:Proving SQL query equivalency