基于现有查询构造动态查询(或算法)

时间:2012-09-13 12:25:52

标签: c# sql algorithm

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

假设我有一个功能

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

  • inputQuery:包含许多字段和表,连接以及where条件的字符串查询
  • mandatoryTables:强制表列表
  • userFields:用户在某个网络或桌面应用中选择的字段列表

函数必须返回带有表和连接的优化查询,只有查询才能成功。

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"

userFields是:SomeFieldB,SomeFieldC

mandatoryTables:Table1

所以预期的查询是:

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

我的问题是:是否有某种工具可以解决这类问题或者你们如何解决这个问题?我在想二叉树......

此致 贾尼

1 个答案:

答案 0 :(得分:1)

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

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