键值表上的T-SQL Order By

时间:2011-10-13 07:24:55

标签: sql tsql

我有两张表,如:

文档{#DocId,SomeData} KeyValues {#RowId,DocId,Name,Value}

它的值如下:

文档

D1 | This is content of doc 1

D2 | This is content of doc 2

键值

1 | D1 | Firstname | David

2 | D1 | Lastname  | Andersson

3 | D2 | Firstname | Anders

4 | D2 | Lastname  | Andersson

我想获取Doc.SomeData和按名字的值排序

你怎么做?枢?加入?

EDITED 我可能已经简化了很多。 KeyValue表的值分为几列,但获取值的实际列是在C#代码中定义的,其中SQL是动态生成的:

KeyValues {#RowId,DocId,Name,StringValue,IntegerNumericValue,FractalNumericValue,BoolValue,GuidValue,DateTimeValue}

使用左连接需要我为每个排序表达式发出一个左连接,否则该组可能会在结果中重复显示文档。

3 个答案:

答案 0 :(得分:1)

试试这个:

SELECT SomeData 
FROM Doc d
INNER JOIN KeyValues k ON d.DocId = k.DocId AND k.Name = 'FirstName'
ORDER BY k.Value

更新: 如果您的排序需要根据从c#代码传递的值动态,那么您可以按顺序使用case by like:

SELECT SomeData 
FROM Doc d
INNER JOIN KeyValues k ON d.DocId = k.DocId AND k.Name = @PassedValue
ORDER BY CASE WHEN @PassedValue = 'FirstName' THEN k.StringValue
              WHEN @PassedValue = 'LastName' THEN k.StringValue
              WHEN @PassedValue = 'Date' THEN k.DateTimeValue
              ELSE k.StringValue 
              END

答案 1 :(得分:0)

SELECT Doc.SomeData, KV.Value
FROM Doc JOIN KeyValues KV ON Doc.DocId = KV.DocId
WHERE KV.Name = 'Firstname'
ORDER BY KV.Value

答案 2 :(得分:0)

查看Gist对该解决方案的评论。任何调整都非常受欢迎。

https://gist.github.com/1343449#comments