Welcome to Sign in | Help

Re: select distinct...order by?

  •  08-03-2007, 4:19 PM

    Re: select distinct...order by?

    rsocol:

    Mesajul de eroare apare pentru că nu prea are sens ceea ce ceri.

    Razvan: in opinia mea lucrurile nu prea sunt chiar asa.Totul depinde de modul in care motorul SGBD-ului (M-SGBD) executa interogarea. Voi incerca sa ma explic.

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    Mesajul de eroare "ORDER BY items must appear in the select list if SELECT DISTINCT is specified." demonstreaza o LIMITARE a motorului sistemului de gestiune a bazelor de date (SQL Server database engine), limitarea care provine din solutia pe care o alege M-SGBD pentru a elimina duplicatele ca urmare a existentei clauzei DISTINCT in comanda SQL.

     

    Pornind de la exemplu cu tabela T amintit de tine daca vom executa comanda SELECT  a,b FROM T ORDER BY b,c vom obtine setul de inregistrari:

    a     b     c    (coloana c este prezentata cu scop orientativ)

    ------------------- 

    2    10    200           (inregistrarea I)
    3    10    300           (inregistrarea II)
    2    10    400           (inregistrarea III)
    1    10    500            (inregistrarea IV)

    Ca urmare a executiei unei posibile comenzi  SQL SELECT DISTINCT  a,b FROM T ORDER BY b,c M-SGBD ar trebui sa elimine una din inregistrarile I sau III (sunt subliniate). Acest fapt ar putea conduce la urmatoarele POSBILE seturi de inregistrari rezultate:

    (a) daca se elimina inregistrarea duplicat I (mai precis perechea de valori 2 - 10) rezultatul ar trebui sa fie:

     3    10    300           (inregistrarea II)
    2    10    400           (inregistrarea III rămâne)
    1    10    500            (inregistrarea IV)

    sau

    (b) daca se elimina inregistrarea duplicat III (mai precis perechea de valori 2 - 10) rezultatul ar trebui sa fie:

     

    2    10    200           (inregistrarea I rămâne)
    3    10    300           (inregistrarea II)
    1    10    500            (inregistrarea IV)

    Atat in cazul (a) cat si in cazul (b) inregistrarile sunt ordonate după valorile din campurile b şi c.

    In concluzie cerinta are sens  dpmdv, problema  este la  SQL Server pentru ca  acesta  va incerca sa minimizeze timpul de executie a interogarii SQL in ceea ce priveste clauza DISTINCT prin ordonarea/sortarea (ORDER BY) sau grupare inregistrarilor (GROUP BY, care in ultima instanta presupune tot o sortare).

    Cu alte cuvinte daca vom avea o interogare SQL SELECT DISTINCT  a,b FROM ... M-SGBD va ordona (sorta) sau grupa (a se vedea imaginea) inregistrarile dupa (valorile din campurile) a si b (campuri specificate in clauza SELECT DISTINCT).

     ss

     In concluzie este normal din acest punct de vedere ca IN FINAL inregistrarile sa fie ordonate dupa valorile campurilor din SELECT DISTICNT si anume a si b.

     

    Ultima concluzie: cerinta nu este "imposibila". Limitarile SQL Server fac ca acesta interogare sa fie "imposibila".

     
    PS : si da, "deşi-urile" de la finalul primul mesaj exprima scepticismul meu in legatura cu ordinea in care vor fi afisate IN FINAL inregistrarile din subinterogare.

View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems