证明SQL查询等效

Mat*_*son 22 sql oracle

你将如何证明两个查询在功能上是等价的,例如它们将始终返回相同的结果集.


因为我在做这个时有一个特定的查询,所以我最终按照@dougman的建议,超过了大约10%的表所涉及的行并比较结果,确保没有不合适的结果.

Dou*_*ter 13

您可以做的最好的事情是根据给定的输入集比较2个查询输出,寻找任何差异.要说它们将始终为所有输入返回相同的结果,这实际上取决于数据.

对于Oracle来说,最好的方法之一(非常有效)就在这里(Ctrl+ F比较两个表的内容):
http://www.oracle.com/technetwork/issue-archive/2005/05-jan/o15asktom-084959.html

归结为:

select c1,c2,c3, 
       count(src1) CNT1, 
       count(src2) CNT2
  from (select a.*, 
               1 src1, 
               to_number(null) src2 
          from a
        union all
        select b.*, 
               to_number(null) src1, 
               2 src2 
          from b
       )
group by c1,c2,c3
having count(src1) <> count(src2);
Run Code Online (Sandbox Code Playgroud)


Rik*_*Rik 9

这听起来像是一个NP完全问题.我不确定是否有一种确定的方法来证明这种事情


San*_*ord 6

您应该真正检查Cosette:它检查(带有证明)2个SQL查询是否等效,如果不相等则检查计数器示例。这是绝对可以肯定的唯一方法,几乎​​是;)您甚至可以在其网站上输入2个查询并立即检查(正式)等效性。

链接到珂赛特:http : //cosette.cs.washington.edu/

链接到文章,该文章对Cosette的工作方式进行了很好的解释:https//medium.com/@uwdb/introducing-cosette-527898504bd6

如果您只是想快速实用地解决问题,还可以检查一下stackoverflow答案: [sql-检查两个select是否相等]