0

ユーザーが選択したフィールドを持つ既存のクエリに基づいて、動的クエリ (またはアルゴリズム) を構築するタスクがあります。説明させてください:

関数があるとしましょう

ConstructQuery(string inputQuery, string[] RequiredTables, string[] userFields) と 2 つの入力パラメーター:

  • inputQuery: 多くのフィールドとテーブル、結合、および where 条件を含む文字列クエリ
  • RequiredTables: 必須テーブルのリスト
  • 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"

userFields は次のとおりです: SomeFieldB、SomeFieldC

必須テーブル: テーブル 1

したがって、予想されるクエリは次のとおりです。

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 に答える