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