Welcome to Sign in | Help

Re: select distinct...order by?

  •  08-03-2007, 2:49 PM

    Re: select distinct...order by?

    Ioana,

    Mesajul de eroare apare pentru că nu prea are sens ceea ce ceri. Să luăm în considerare următorul exemplu:

    CREATE TABLE T (
        a int,
        b int,
        c int,
        PRIMARY KEY (a,b,c)
    )

    INSERT INTO T VALUES (1,10,500)
    INSERT INTO T VALUES (2,10,400)
    INSERT INTO T VALUES (2,10,200)
    INSERT INTO T VALUES (3,10,300)

    Dacă încercăm următoarea instrucţiune:

    SELECT DISTINCT a,b FROM T ORDER BY b,c

    atunci primim eroarea menţionată ("ORDER BY items must appear in the select list if SELECT DISTINCT is specified."). Însă, în definitiv, care ar fi fost rezultatul corect ?

    a) luând în considerare rândul 2,10,200

    2,10
    3,10
    1,10

    sau

    b) luând în considerare rândul 2,10,400

    3,10
    2,10
    1,10

    Evident, cerinţa nu e suficient de clară, aşa că nu există un rezultat corect.

    Pe de altă parte, să încercăm un query cu soluţia sugerată de Bogdan:

    SELECT DISTINCT a,b FROM (
        SELECT TOP 100 PERCENT * FROM T ORDER BY b,c
    ) x

    Observăm că rezultatul este:

    1,10
    2,10
    3,10

    deci nu se respectă ordinea specificată în subquery. Cred că exact la asta se referea Bogdan când scria "deşi... deşi... deşi...": faptul că deşi uneori ni se pare că ORDER BY-ul cu TOP 100 PERCENT funcţionează în view-uri şi subquery-uri, este de fapt doar o întâmplare.

    Am putea să rezovăm această problemă dacă modificăm (sau clarificăm, mai bine zis) cerinţele: spunem că de fapt nu vrem să se ordoneze după coloana c, ci după cea mai mică valoare din coloana c pentru fiecare rând distinct selectat. Adică, optăm pentru rezultatul menţionat la litera a), mai sus, iar în acest caz, query-ul ar fi:

    SELECT a,b FROM T GROUP BY a,b ORDER BY b,MIN(c)

    Răzvan

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