Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Die Rownum-Anweisung gibt eine andere Zeile zurück als ohne sie

Ihr Problem wird dadurch verursacht, dass der where -Klausel wird vor order by angewendet .

Sie können das Problem umgehen, indem Sie zuerst sortieren und dann rownum anwenden :

select * from (
    select deptno from emp 
     where job='CLERK' 
     group by deptno 
    having count(job)=(select min(count(job)) from emp where job='CLERK'group by deptno) 
     order by deptno) 
where rownum=1;

Hinweis:

Dieses Problem ist Oracle-spezifisch. MS SQL Server TOP und MySQL LIMIT werden beide nach order by angewendet Klausel.

Anmerkung 2:

In Oracle Database 12c ( 12.1), gibt es eine neue Funktion zum Auswählen der Zeilen k bis k+m , offset k rows fetch next m rows only . Ich würde empfehlen, es anstelle der obigen Lösung zu verwenden. Danke an Lalit Kumar B für den Hinweis.

select deptno from emp 
 where job='CLERK' 
 group by deptno 
having count(job)=(select min(count(job)) from emp where job='CLERK'group by deptno) 
order by deptno
fetch next 1 rows only

Aber was ist, wenn es zwei (oder mehr) Abteilungen mit derselben Nummer gibt? Keine Sorge, es gibt eine Variante, die alle Bindungen zurückgibt:

select deptno from emp 
 where job='CLERK' 
 group by deptno 
having count(job)=(select min(count(job)) from emp where job='CLERK'group by deptno) 
order by deptno
fetch next 1 rows with ties