【问题标题】:Row num is not working for duplicate columns while pagination分页时行号不适用于重复列
【发布时间】:2015-04-17 18:58:43
【问题描述】:

代码如下,多个嵌套查询:

 select *
        from
      (select employee_id,employee_id
         from employees) a
       where rownum <= 5
      )
       where rnum >= 10

如果我在选择中给出重复的列,则会给出“列定义不明确”错误。

【问题讨论】:

  • 请提出您的问题并提供更多详细信息。究竟是什么“不工作”?分页效果如何?
  • 如果我在选择中给出重复的列,其给出的列定义不明确错误..select * from (select a.*,Rownum rnum from (select employee_id,employee_id from employees) a where rownum = 10

标签: oracle pagination


【解决方案1】:

employee_id,employee_id,rownum rnum

  • 首先,您的查询不正确,因为您模糊地定义了列。它会抛出ORA-00918: column ambiguously defined

您必须使用正确的 ALIAS 以避免错误。例如,

SELECT departments.department_id AS "dept_id", 
        employees.department_id  AS "emp_Dept_id" 
FROM...
  • 其次,它根本不是分页查询。由于没有 ORDER BY 子句,因此您总是会选择随机行。您没有对行进行排序。

其中rownum

其中 rnum >= 10

  • 最后,当您在内部查询中仅获取 5 行时,您究竟如何尝试获取超过 10 行?它将总是返回零行 .

数据分页的正确方式是:

SQL> SELECT empno
  2  FROM   (SELECT empno, rownum AS rnum
  3          FROM   (SELECT empno
  4                  FROM   emp
  5                  ORDER BY sal)
  6          WHERE rownum <= 8)
  7  WHERE  rnum >= 5;

     EMPNO
----------
      7654
      7934
      7844
      7499

SQL>

【讨论】:

  • 好的,但问题是如果我在选择中有来自不同表的两个相同的列(如部门.department_id,employees.department_id),它会抛出相同的错误
  • 使用正确的alias。阅读有关如何将 alias 用于列名的文档。例如,SELECT departments.department_id deptid, employees.department_id emp_dept_id...
  • 正因部门.department_id 等于 employees.department_id,你为什么要同时返回它们?
  • 或者如果有任何其他方法可以从数据库中获取有限数量的记录,请提及。
【解决方案2】:

当您提供a.* 时,这意味着您试图在一个表中引用两个具有相同名称的列,这是不允许的。表中的列名是唯一的

所以select employee_id,employee_id from employees 不是问题

但是

select a.* from (select employee_id,employee_id from employees)a 是个问题

the sqlfiddle here

此外,如果您希望查询中包含 10 到 15 的记录,请使用如下方式

  select * from 
     (select a.*,Rownum rnum from 
     (select employee_id as emp_id1,employee_id as emp_id2 
         from employees order by 1) 
      a where rownum <= 15 ) where rnum >= 10 

EDIT1:-如果需要重复的列,如下所示使用

  with emp1 as (select employee_id from employees),
  emp2 as (select * from 
          (select a.*,rownum rnum from emp1 a order by 1)   
           where rownum <=15)
  select b.*,c.*
  from emp1 b,emp2 c
  where b.employee_id=c.employee_id
  and c.rnum >=10

【讨论】:

  • 是的,你是对的,但我需要在不为重复列提供别名的情况下实现这一点,这可能吗?
  • 你为什么要那样做
  • 我不能为重复的列提供别名,我需要与 db 中出现的列同名。
  • SQL> emp1 as (select employee_id from emp), SP2-0734: 未知命令以“emp1 as (s...”开头 - 忽略行的其余部分。SQL> emp2 as (select * from SP2 -0734: 以“emp2 as (s...”开头的未知命令 - 忽略行的其余部分。SQL> (select a.*,rownum rnum from emp1 a order by 1) 2 where rownum =10; (select a.*,rownum rnum from emp1 a order by 1) * 第1行的错误: ORA-00907:缺少右括号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2017-06-24
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2016-07-16
相关资源
最近更新 更多