sql >> データベース >  >> RDS >> Oracle

Rownumステートメントは、それがない場合とは異なる行を返します

    あなたの問題は、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
    


    1. 挿入ステートメントにIDがないOracle/PostgreSQLのシーケンス

    2. 最も近い試合、パート3

    3. SQLで平均を丸めるときに小数を取得するにはどうすればよいですか?

    4. Oracle SQLで重複する行を削除し、最新のエントリを残します