【发布时间】: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