7

私はある種の資源管理システムを書いています。

リソースは定義のインスタンスです。定義はメタデータであり、基本的にはプロパティが含まれています。

これは一般的に私のDBです:

TypeDefinition
id    name
===============
1     CPU


PropertyDefinition
id    name       typeDefinitionId   valueType
================================================
1     frequency  1                  int
2     status     1                  string


TypeInstance
id    name     typeDefinitionId
=================================
1     CPU#1    1  
2     CPU#2    1


PropertyInstanceValue
id   propertyDefinitionId  typeInstanceId   valueType   intValue  StringValue FloatValue
========================================================================================
1    1                     1                int         10
2    2                     1                string                Pending
3    1                     2                int         20
4    2                     2                string                Approved

要件:

特定のプロパティ値に従ってすべてのリソースを並べ替えます。

例:すべてのリソースをステータスに従って並べ替えます->「承認済み」は「保留中」の前にあるため、CPU#2はCPU#1の前に表示されます。

頻度で注文すると、10は20より前なので、CPU#1はCPU#2より前に表示されます。

そのため、プロパティのvalueTypeに応じて、毎回異なる列(intValue / stringValue / FloatValueなど)に従って並べ替える必要があります。

なにか提案を?

制限:

現在、PIVOTは私たちが考えている唯一のオプションですが、DBが巨大であり、クエリをできるだけ高速にする必要があるため、実際には不可能です。

よろしくお願いします、

ミハル。

4

3 に答える 3

5

クエリを動的に作成したくないという問題がある場合は、次のorder by構造を使用します。

order by case @orderby
    when 'status' then status
    when 'frequency' then frequency
    end
option (recompile)

パラメータを渡し@orderbyます。最後recompile optionに、渡されたパラメーターに従ってエンジンに新しいプランを強制的に作成させます。つまり、ストアド プロシージャを使用していると仮定します。

于 2012-10-18T16:04:44.810 に答える
0

あなたの質問を正しく理解できれば、次のようにアプローチします。

  1. 許可された文字列値のテーブルを作成し、並べ替えの優先順位を指定するための列を必ず含めます (これを AllowedValues と呼びましょう)

    テーブルを作成 [dbo].[AllowedStringValues] (PropertyDefinitionId int、stringValue varchar(250)、sortOrder int)

  2. 行の PropertyDefinition に基づいて適切な値を選択する複雑なサブクエリを作成します (データ型に応じて 3 つの列の中から探す必要があるようです)。

  3. 値が文字列型の場合、サブクエリを AllowedStringValues テーブルと内部結合します (値が値列に格納されていると仮定します)。

    ValueType=String AND 値 = stringValue OR ValueType <> string の内部結合 AllowedStringValues

  4. 文字列の場合は AllowedValues の並べ替え優先度で並べ替え、それ以外の場合は数値で並べ替えます。

    大文字と小文字による順序 ValueType の場合は 'string' then sortOrder else value end

于 2012-10-18T20:00:50.390 に答える
0

SQL を使用してクエリ結果を並べ替える場合 (結果が返された後に呼び出し元のアプリケーションで並べ替えるのではなく)、ダイナミック SQL を生成し、sp_executesql を使用して実行する必要があります。

http://msdn.microsoft.com/en-us/library/ms188001.aspx

于 2012-10-18T16:04:51.047 に答える