2012-10-18 9 views
7

Piszę jakiś system zarządzania zasobami.T-SQL ORDER BY zgodnie z warunkiem

Zasób jest instancją definicji. Definicja to metadane, w zasadzie zawiera ona właściwości.

To jest w ogóle moim DB:

TypeDefinition 
id name 
=============== 
1  CPU 


PropertyDefinition 
id name  typeDefinitionId valueType 
================================================ 
1  frequency 1     int 
2  status  1     string 


TypeInstance 
id name  typeDefinitionId 
================================= 
1  CPU#1 1 
2  CPU#2 1 


PropertyInstanceValue 
id propertyDefinitionId typeInstanceId valueType intValue StringValue FloatValue 
======================================================================================== 
1 1      1    int   10 
2 2      1    string    Pending 
3 1      2    int   20 
4 2      2    string    Approved 

Wymagania:

kolejność wszystkich zasobów zgodnie z wartością specyficzne własności.

Na przykład: zamów wszystkie zasoby według ich stanu status -> Znaczenie CPU # 2 pojawi się przed CPU # 1, ponieważ "Zatwierdzono" jest przed "Oczekujące".

Gdybyśmy zamówienie według częstotliwości, CPU # 1 pojawi się przed CPU # 2, ponieważ 10 jest przed 20.

Więc muszę uporządkować za każdym razem, według innej kolumny (intValue/stringValue/FloatValue/etc), w zależności od właściwości valueType.

Jakieś sugestie?

OGRANICZENIE:

PIVOT jest obecnie jedynym rozwiązaniem jakie myśli, ale to naprawdę nie jest możliwe, ponieważ DB jest ogromny i muszę zapytać się tak szybko, jak to możliwe.

Bardzo dziękuję z góry,

Michal.

+0

postu kod masz tak daleko, i daj nam znać, gdzie utkniesz –

+0

Wygląda na to, mieć szczególnie nieprzyjemną formę konfiguracji [EAV] (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model). Masz również problem z denormalizacją, który może powrócić, aby cię ugryźć (ponieważ 'valueType' jest duplikowany w' PropertyInstanceValue'). Nie potrzebujesz pivota (i czy będzie on konsekwentnie porządkował _kolumny_, czy tak?), To można zrobić tylko z połączeniami i niektórymi skorelowanymi tabelami wyników, o ile napiszesz je dla jednej kolumny. Ale czy jesteś wyłącznie zainteresowany _phphabetycznym_ porządkiem statusu lub innymi kryteriami? –

Odpowiedz

5

Jeśli problem jest to, że nie chcesz, aby dynamicznie zbudować kwerendę następnie użyć tego order by strukturę:

order by case @orderby 
    when 'status' then status 
    when 'frequency' then frequency 
    end 
option (recompile) 

Będziesz przekazać parametr @orderby. Ostateczna wersja to zmusić silnik do zbudowania nowego planu zgodnie z przekazanymi parametrami, czyli przy założeniu, że używasz procedury składowanej.

+0

To dobra alternatywa dla Dynamic SQL, o której nie wiedziałem. +1 – Jim

0

Jeśli dobrze rozumiem pytanie, chciałbym go zbliżyć się następująco:

  1. Tworzenie tabeli dozwolonych ciągów znaków, upewniając się, aby dodać kolumnę do określania sortowania pierwszeństwo (nazwijmy to AllowedValues)

    utworzyć tabelę [dbo].[AllowedStringValues] (PropertyDefinitionId int, stringValue varchar (250), sortOrder int)

  2. Utwórz złożone podzapytanie, które wybiera właściwą wartość na podstawie właściwości PropertyDefinition wiersza (wygląda na to, że musi wyglądać w 3 kolumnach w zależności od typu danych to jest).

  3. Jeśli wartość jest typu łańcucha, sprzężenie wewnętrzne podkwerendę z tabeli AllowedStringValues ​​ (wartość zakładając przechowywano w kolumnie wartości)

    sprzężenia wewnętrznego AllowedStringValues ​​na ValueType = ciąg i wartością = stringValue lUB ValueType <> ciąg

  4. Sortuj według priorytetu sortowania w AllowedValues ​​jeśli jest ciągiem znaków, lub przez inny sposó wartości numerycznej Ise.

    uporządkuj sprawy ValueType kiedy „string”, a następnie sortowanie wartość indziej koniec