2011-10-13 23 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