两条 SQL 语句的数学相等性

gue*_*tli 10 database-theory

有没有办法检查两个 SQL 语句的数学相等性?

我有两个 SQL 语句:

  • SQL_STATEMENT_1
  • SQL_STATEMENT_2

对数据运行这两个语句并比较输出根本没有帮助。

需要评估语句背后的集合数学,就像方程求解器一样。

超出我的问题范围的是:

  • 等式以外的比较(大于、小于、LIKE、...)
  • 存储过程或触发器
  • 公用表表达式 (WITH)

范围内:

  • 子选择:WHERE other_id IN (SELECT id FROM other WHERE ...)
  • 加入

For*_*esR 7

两条 SQL 语句的数学等式是什么?对我来说,两个查询是等效的,如果在给定任何数据集的两个相同时,它们返回相同的结果集。

正如您所指出的,SQL 查询是关系代数的超集,可能非常复杂。我们可以混合子查询,使用存储过程和函数(确定性或非确定性),这将使您的查询看起来更像真正的代码。如果您正在谈论这些类型的查询,那么这将非常困难。事实上,它可能与“两种算法等价”问题没有什么不同。

在这种情况下,这可能是不可能的。

然而...

...如果您要比较的两个查询是严格的集合操作,这可能是可行的。如果是这样,您可以将查询转换为关系代数,然后按照等价规则进行计算。如果您有一个具有非平凡布尔条件的选择/限制,那么您最终可能需要证明这些条件也是等价的。然后你需要依赖布尔代数,你可能最终会做一个真值表

如您所见,这将需要大量工作,据我所知,没有任何东西可以自动计算所有这些。不过,我发现了一些工具,如果您想处理任务,您可能会发现它们很有用:


小智 1

一种方法是构建一个解析器,或者更好的是使用现有的解析器。我相信 C# 有一个 TSQLParser 类并且有一个 Parse() 方法。解析器会将您的查询分解为子类,然后您可以进行比较。