2011-10-13 83 views
0

我有两个表所示:T-SQL顺序按上键 - 值表

文件{#DocId,SomeData} 版键值{#RowId,文档ID,名称,值}

,它具有值像:

文档

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和秩序?枢?加入?

编辑 我可能简化了很多。 KeyValue表的值被分成几列,但获取该值的实际列是在C#代码中定义的,其中SQL是在运行中生成的:

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

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

+0

所以你要动态地根据从C#代码中传递价值对任何列数据进行排序? –

回答

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

试试这个:

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

UPDATE: 如果您排序需要动态地根据从C#代码中传递的,那么你可以通过类似条款,以便使用情况下的值:

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 
+0

这将不会返回一个名字码头不存在。但是,是的,它可以通过左连接来解决,但我不希望返回集合中的KeyValues的内容。只是想用它来分类。 – Daniel

+0

您能详细描述问题吗?对不起,但我没有从你的评论中得到你。它只会返回SomeData而不是keyvalues表中的任何字段。 –

+0

我用更多的信息更新了这个问题。看那里,然后我希望你明白我的意思。 – Daniel