7

我正在编写某种资源管理系统。

资源是定义的一个实例。定义是元数据,基本上它包含属性。

这通常是我的数据库:

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 之前,因为“Approved”在“Pending”之前。

如果我们按照频率排序,CPU#1 会出现在 CPU#2 之前,因为 10 在 20 之前。

所以我每次都需要根据不同的列(intValue / stringValue / FloatValue / etc)进行排序,具体取决于属性的valueType。

有什么建议吗?

局限性:

PIVOT 目前是我们想到的唯一选择,但这实际上是不可能的,因为数据库很大,我需要尽可能快的查询。

非常感谢提前,

迈克尔。

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 表进行内连接(假设值存储在值列中)

    内连接 AllowedStringValues on ValueType=String AND value = stringValue OR ValueType <> string

  4. 如果是字符串,则按 AllowedValues 中的排序优先级排序,否则按数值排序。

    'string' 时按大小写 ValueType 然后 sortOrder 否则值结束

于 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 回答