【发布时间】:2011-06-19 14:17:44
【问题描述】:
我开始用连接和子语句重写一个复杂的 SQL 语句,并获得了一个看起来更简单的语句。我通过在相同的数据集上运行并获得相同的结果集来测试它。一般来说,我如何(从概念上)证明这两个语句在任何给定的数据集中都是相同的?
【问题讨论】:
-
正式?通过使用关系代数:en.wikipedia.org/wiki/Relational_algebra
-
您是担心性能,还是只担心数据的正确性?不同的查询可能由数据库引擎以不同的方式处理。尽管它们在形式上可能是等价的,但实际上它们可能非常不同。 Oracle 的解释计划之类的内容可能有助于了解数据库实际上 对您的 sql 执行的操作。如果两者都做同样的事情,你赢了;-D
-
正式证明对我来说可能太多了。我只是想确保它们是等效且正确的,而不必在所有数据集上运行它们。
-
您可以将这两个查询插入解析器 (antlr.org/grammar/list) 以获得它们等效的解析树。如果你对这两棵树进行归一化,你也许可以用这种方式证明它们是等价的。
-
@Martin 在此处发布两个查询的问题,添加赏金 - 利润!
标签: sql theory performance