sql >> Databasteknik >  >> RDS >> Oracle

Rownum-satsen returnerar en annan rad än utan den

Ditt problem orsakas av det faktum att where klausul tillämpas före order by .

Du kan komma runt problemet genom att först sortera och sedan använda rownum :

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;

Obs!

Det här problemet är Oracle-specifikt. MS SQL Server TOP och MySQL LIMIT tillämpas båda efter order by klausul.

Obs 2:

I Oracle Database 12c ( 12.1) finns det en ny funktion för att välja rader k till k+m , offset k rows fetch next m rows only . Jag skulle rekommendera att använda den istället för lösningen ovan. Tack till Lalit Kumar B för att du påpekade det.

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

Men vad händer om det finns två (eller flera) avdelningar med samma nummer? Oroa dig inte, det finns en variant som returnerar alla band:

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


  1. Optimal storlek för databaspartitioner

  2. Hur man utökar kommaseparerade fält till flera rader i MySQL

  3. Hur överför jag produktionsdatabas till staging på Heroku med hjälp av pgbackups? Får fel

  4. SQL - Hitta det pris som ligger närmast ett givet argument