T-SQL Order By в таблице ключ-значение - PullRequest
0 голосов
/ 13 октября 2011

У меня есть две таблицы, такие как:

Документы {#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 и заказать позначение Firstname

Как бы вы это сделали?Pivot?Joins?

EDITED Я мог бы упростить многое.Таблица KeyValue имеет значение, разделенное на несколько столбцов, но фактический столбец для получения значения определен в коде C #, где SQL генерируется на лету:

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

Использование левых объединений потребовало бы от меня одного левого соединения для каждого выражения сортировки, в противном случае набор может получить дублирование документов в результате.

Ответы [ 3 ]

1 голос
/ 13 октября 2011

Попробуйте это:

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

ОБНОВЛЕНИЕ: Если ваша сортировка требуется динамически на основе значений, переданных из кода c #, тогда вы можете использовать case в порядке по выражению, например:

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 голосов
/ 07 ноября 2011

Посмотрите в комментариях к Gist для решения.Любые твики высоко ценятся.

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

0 голосов
/ 13 октября 2011
SELECT Doc.SomeData, KV.Value
FROM Doc JOIN KeyValues KV ON Doc.DocId = KV.DocId
WHERE KV.Name = 'Firstname'
ORDER BY KV.Value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...