2011-10-20 5 views
8

napisałem następujące zapytanie:Wybierz pierwszy wynik tylko

SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL 
FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL 
       FROM PURCHASE GROUP BY CLIENTNO) TOTALS 
WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO AND ROWNUM <= 1 
ORDER BY TOTALS.TOTAL DESC; 

Jednak to daje mi złą odpowiedź, ale jeśli usunąć klauzulę ROWNUM <= 1, to prawidłowa odpowiedź jest w górnej części tabeli wynikowej .

Co mogę zmienić w tym zapytaniu, aby uzyskać prawidłową odpowiedź?

Dzięki, Alex.

EDYCJA: Zapomniałem powiedzieć, że chcę tylko, aby zapytanie zwróciło pierwszy wynik w zestawie wyników.

+2

Problemem jest to, że rownum jest przypisany wcześniej zestaw danych jest posortowana. –

Odpowiedz

16

Filtr ROWNUM stosuje się przed sortowaniem. Co trzeba zrobić, to:

SELECT * FROM (
    SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL 
    FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL 
        FROM PURCHASE GROUP BY CLIENTNO) TOTALS 
    WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO 
    ORDER BY TOTALS.TOTAL DESC 
) 
WHERE ROWNUM <= 1 
+0

http://stackoverflow.com/questions/7753936/fetching-data-using-rownum-in-oracle/7754076#7754076 – rahularyansharma

+0

@rahnalansharma. Ładny link. To nie jest tak naprawdę powiązane, prawda? –

3

Owiń rownum gdzie w innym zapytaniu zewnętrznym:

select * from (
SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL 
FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL FROM PURCHASE GROUP BY CLIENTNO) TOTALS 
WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO ORDER BY TOTALS.TOTAL DESC) 
where ROWNUM <= 1;