あなたの問題は、where
句はorder by
の前に適用されます 。
最初に並べ替えてから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;
注:
この問題はOracle固有のものです。 MS SQL Server TOP
およびMySQLLIMIT
どちらもorder by
の後に適用されます 条項。
注2:
Oracle Database 12c( 12.1)、行kからk+mを選択するための新機能があります
、offset k rows fetch next m rows only
。上記の解決策の代わりにそれを使用することをお勧めします。指摘してくれたLalitKumarBに感謝します。
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
しかし、同じ番号の部門が2つ(またはそれ以上)ある場合はどうなるでしょうか。心配しないでください。すべての同点を返すバリアントがあります:
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