Tema: MSSQL 2008 ir prioritetinis duomenu istraukimas
Autorius: Jornada Del Muerto
Data: 2012-04-10 19:24:57
Sveiki,

    Turiu tokia situacija su MSSQL 2008, kada reikia istraukti tam tikra informacija prioriteto tvarka isrenkant viena ar kita irasa is lentos. 

    Trumpai aktuali traukimui struktura:

Siuntos
----------
Id
KlientoId
MiestoId
GatvesId
Svoris

SiuntuKainos
----------
Id
KlientoId
MiestoId
SvorisNuo
SvorisIki

Dilema ta, kad kainu yra 4 tipai (tiksliau nuo siol bus).  Egzistuoja (jeigu id=0 reiskia skirta visiems):

1. Bendros/globalios kainos siuntoms (KlientoId = 0, miestoId = 0);
2. Bendros/globalios kainos konkreciam miestui (KlientoId = 0, miestoId = X) - (sis kainos variantas atsiras tik dabar);
3. Kliento bendros kainos (KlientoId = X, miestoId = 0);
4. Kliento kainos konkreciam miestui (KlientoId = X, miestoId = X).

Prioriteto tvarka bandoma priskirti sias kainas: 4, 3, 2, 1. 

    Kaip sakant jei klientas turi savo kainas konkreciam miestui tai jas, jei tam miestui ner, bet yra aplamai kliento kaina, tada priskiriama ji, jeigu nera kliento kainu bet globalios kainos turi kainas tam miestui tai si kaina, jeigu nera siam miestui globalios kainos tada bendra kaina.


Siuo momentu as darau taip:

SELECT
    kainosId,
    CASE 
        WHEN K4.Id Is Not Null  THEN K4.Id 
        WHEN K3.Id Is Not Null THEN K3.Id
        WHEN K2.Id Is Not Null THEN K2.Id
        ELSE K1.Id END AS "priceId",
   ......... kiti laukai....
FROM
    Siuntos S
LEFT JOIN
    SiuntuKainos K1 On K1.KlientasId = 0 And K1.MiestasId = 0 And S.Svoris BETWEEN K1.SvorisNuo And K1.SvorisId And ...kitos salygos...
LEFT JOIN
    SiuntuKainos K2 On K2.KlientasId = 0 And K2.MiestasId = S.MiestasId And S.Svoris BETWEEN K2.SvorisNuo And K2.SvorisId And ...kitos salygos...
LEFT JOIN
    SiuntuKainos K3 On K3.KlientasId = S.KlientasId And K3.MiestasId = 0 And S.Svoris BETWEEN K3.SvorisNuo And K3.SvorisId And ...kitos salygos...
LEFT JOIN
    SiuntuKainos K4 On K4.KlientasId = S.KlientasId And K4.MiestasId = S.MiestasId And S.Svoris BETWEEN K4.SvorisNuo And K4.SvorisId And ...kitos salygos...


Tai vat, kokie pasiulymai optimizuoti si shmota? :)

PS. 
    Viskas kaip ir veikia, tik dabar reikes dadeti kaina Nr 2 (Globalios miestu kainos), tai susimasciau gal cia ka eitu pagerinti?