【问题标题】:SQL parsing for logical equality [closed]SQL解析逻辑相等[关闭]
【发布时间】:2021-03-31 07:54:41
【问题描述】:

我有一个问题,希望这里有人可以提供帮助。我在一个文件中有数千条 SQL 语句,并且必须根据 WHERE 子句的逻辑相等来识别重复项。例如

SQL1

SELECT * FROM table1 WHERE col1='A' AND col2='B';

SQL2

SELECT * FROM table1 WHERE col2='B' AND col1='A';

在上面的例子中 SQL1 & SQL2 是一样的。这是问题的简单说明。 我正在寻找关于我可以在这里采取的不同方法的指针。 我曾尝试使用Apache Calcite 作为一个选项,让我比较树是我现在倾向于的选项,但想看看那里是否有明显的东西我不知道。

提前致谢

【问题讨论】:

  • Stack Overflow 不是免费的编码服务。到目前为止,您尝试了什么,为什么它不起作用?您已标记java,所以我假设解决方案需要使用Java?您现有的 Java 代码是什么?
  • 您要求的是需要很多很多年的开发工作。在您友好的社区开源 db impl 中查看“查询优化器”(我可以建议您查看 postgres 源代码吗?) - 它非常复杂。它首先需要解析 SQL,这是一种众所周知的难以解析的语言,然后做一些非常复杂的工作来简化和重写查询。您可以使用 psql 的查询优化器,这需要您熟悉该代码库并用 C 编写它,或者,您可以...
  • ... 在这里严格限制您的要求,并且 [A] 添加大量关于 SQL 应该是什么样子的警告,并记录如果 SQL 看起来不像这样,您的'dupe finder' 将不起作用,并且 [B] 严重限制了您的 dupe finder 实际可以找到的内容。一旦你写下你所做的并且不想限制,这个问题可能会变成一个人周项目。从那里开始,可能适合作为 StackOverflow 问题。
  • 我查看了 apache calcite 并使用它的解析器来获取语法树并将其作为选项之一进行比较,我应该在原始评论中添加它:)。你们在这里很残酷
  • 执行它们,看看它们是否返回完全相同的结果;)

标签: java sql sql-server algorithm parsing


【解决方案1】:

我不知道您的问题是否有简单的解决方案,但我会建议一种可以帮助您识别一些重复项的技术。

为自己获取大量数据库副本,然后编写一个程序,逐个运行查询,比较结果。如果结果相似,则将查询标记为可能重复。

您可以使用以下标准来确定SELECT 查询的结果集是否相同:

if the number of rows is the same
->and number of columns is the same
->and the actual data is the same
->then its most likely that the queries are the same

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多