2012-10-18 22 views
7

我在写某种资源管理系统。根据条件T-SQL ORDER BY

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

这是一般我的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之前,因为“已批准”在“待定”之前。

如果我们根据频率订购,CPU#1将前CPU#2,因为10是前20.

所以我需要根据不同的列(的intValue/stringValue的每个时间整理出现/ FloatValue/etc),具体取决于属性的valueType。

有什么建议吗?

限制:

PIVOT目前我们已经想到的唯一选择,但由于数据库是巨大的,我需要查询的是尽可能快它不是真的有可能。

非常感谢,

Michal。

+0

后,你被卡住 –

+0

我们知道你的代码到目前为止,让看起来你有[EAV](http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)设置的特别令人讨厌的形式。你也有一个非规范化问题,可能会反过来咬你(因为'valueType'在'PropertyInstanceValue'中被复制)。你不会需要数据透视(并且它会始终对_columns_进行排序?),只要您为一列写入数据,就可以使用连接和一些相关的结果表来完成此操作。但是,您是否仅对状态的_alphabetic_顺序或其他标准感兴趣? –

回答

5

如果问题是,你不想来动态构建查询然后使用这个order by结构:

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

您将通过@orderby参数。最后的recompileoption是强制引擎根据传递的参数建立一个新的计划,也就是假设你正在使用一个存储过程。

+0

这是我不知道的动态SQL的一个很好的选择。 +1 – Jim

0

如果我正确理解你的问题,我会如下来解决:

  1. 创建允许的字符串值的表,并确保包括列指定排序优先级(姑且称之为This AllowedValues)

    create table [dbo]。[AllowedStringValues](PropertyDefinitionId int,stringValue varchar(250),sortOrder int)

  2. 创建一个复杂的子查询,根据行的PropertyDefinition选择适当的值(看起来它需要根据数据类型它是)。

  3. 如果该值是字符串类型,内连接与AllowedStringValues表 子查询(假设值储存到一个值列)

    内上的ValueType =串和值加入AllowedStringValues = stringValue的OR值类型<>串

  4. 排序在ALLOWEDVALUES排序优先级,如果它是一个字符串,或者由数值otherw伊势。

    顺序逐案值类型 当“串”,那么中将sortOrder 其他值 结束