0

我的任务是根据现有查询和用户选择的字段构建动态查询(或算法)。让我解释:

可以说我有一个功能

ConstructQuery(string inputQuery, string[] requiredTables, string[] userFields) 带有 2 个输入参数:

  • inputQuery:具有许多字段和表、连接和 where 条件的字符串查询
  • 强制表:强制表列表
  • userFields:用户在某些 Web 或桌面应用程序中选择的字段列表

函数必须返回优化查询,其中包含查询成功所需的表和连接。

inputQuery 例如构造如下:

SELECT
    Table1.SomeFieldA,
    Table2.SomeFieldB,
    Table2.SomeFieldC,
    Table3.SomeFieldD
FROM   Table1
JOIN   Table2 ON Table1.Code = Table2.Code
JOIN   Table3 ON Table2.Code = Table3.Code
WHERE  Table1.SomeConditionField = "xyz"

用户字段是:SomeFieldB、SomeFieldC

强制性表格:Table1

所以预期的查询是:

SELECT
    Table2.SomeFieldB,
    Table2.SomeFieldC
FROM   Table1
JOIN   Table2 ON Table1.Code = Table2.Code
WHERE  Table1.SomeConditionField = "xyz"

我的问题是:是否有某种工具可以解决此类问题,或者你们将如何解决?我在考虑二叉树...

问候,贾尼

4

1 回答 1

1

这就是所谓的联接删除。这(非常)困难。仅仅解析查询是不平凡的,那么你必须分析语义,考虑什么是唯一键,什么是外键,才有机会删除一些表。在您的示例中:算法必须知道 table3.code 是唯一的,并且是 table2.code 的外键,否则查询不等效。

首先生成正确的查询可能更容易。这就是一些 ORM 所做的。

于 2012-09-13T14:41:45.380 回答