Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Instrukcja Rownum zwraca inny wiersz niż bez niego

Twój problem jest spowodowany faktem, że where klauzula jest stosowana przed order by .

Możesz obejść problem, najpierw sortując, a następnie stosując 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;

Uwaga:

Ten problem jest specyficzny dla Oracle. MS SQL Server TOP i MySQL LIMIT oba są stosowane po order by klauzula.

Uwaga 2:

W Oracle Database 12c ( 12.1), dostępna jest nowa funkcja wybierania wierszy od k do k+m , offset k rows fetch next m rows only . Sugerowałbym użycie go zamiast powyższego rozwiązania. Dziękuję Lalit Kumar B za wskazanie tego.

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

Ale co, jeśli są dwa (lub więcej) działy o tym samym numerze? Nie martw się, istnieje wariant, który zwraca wszystkie remisy:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zip przy użyciu procedury składowanej Oracle

  2. Wykonywanie dynamicznego DDL w procedurze PL/SQL poprzez uprawnienia roli definiującego

  3. Oracle TNS — nie można połączyć się przez administratora ODBC

  4. Oracle SYS_REFCURSOR nie mógł użyć jako typu zwracanego

  5. Czy mogę wykonać atomowe MERGE w Oracle?