【问题标题】:Rownum statement returns different row than without itRownum 语句返回与没有它时不同的行
【发布时间】:2015-04-02 20:08:43
【问题描述】:

好的,所以我有这个 select 语句,它返回作为 CLERKS 工作的人数最少的部门编号,但是由于数据库中的数据,它返回两个部门。当我添加 rownum=1 时,它给了我一个完全不同的部门编号,它拥有最多的 CLERKS,我不知道为什么会这样。帮助表示赞赏

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);

我尝试在主选择语句和子选择语句中使用 rownum,但结果相同。我什至使用 order by,它仍然产生相同的结果。

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

这是与 rownum 和 order by 相同的语句。

【问题讨论】:

  • 你使用的是什么数据库?

标签: sql oracle


【解决方案1】:

您的问题是由于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 和 MySQL LIMIT 都应用在order by 子句之后。

注2:

In Oracle Database 12c (12.1), there is a new feature for selecting rows k through k+moffset k rows fetch next m rows only。我建议使用它而不是上面的解决方案。感谢 Lalit Kumar B 指出这一点。

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

但是如果有两个(或更多)部门的编号相同怎么办?别担心,有一个变体可以返回所有的关系:

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

【讨论】:

    【解决方案2】:

    按照@Klas 的另一个回答:

    Oracle 12c 中,您可以使用新的 Top-N 行限制功能

    例如,

    SQL> SELECT empno, sal FROM emp ORDER BY sal DESC;
    
         EMPNO        SAL
    ---------- ----------
          7839       5000
          7902       3000
          7788       3000
          7566       2975
          7698       2850
          7782       2450
          7499       1600
          7844       1500
          7934       1300
          7521       1250
          7654       1250
          7876       1100
          7900        950
          7369        800
    
    14 rows selected.
    
    SQL> SELECT empno, sal
      2  FROM emp
      3  ORDER BY sal DESC
      4  FETCH FIRST 5 ROWS ONLY;
    
         EMPNO        SAL
    ---------- ----------
          7839       5000
          7788       3000
          7902       3000
          7566       2975
          7698       2850
    

    【讨论】:

    • 不错!当我升级时,我终于可以摆脱那个额外的层了。
    猜你喜欢
    • 2023-01-03
    • 2021-08-13
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多