我有两张表,如:
文档{#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}
使用左连接需要我为每个排序表达式发出一个左连接,否则该组可能会在结果中重复显示文档。
答案 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对该解决方案的评论。任何调整都非常受欢迎。