Oracle Rownum SQL

Oracle Rownum SQL,sql,oracle,Sql,Oracle,这两种编码技术的优缺点是什么 select * from ( select rownum rnun, * from table where rownum < x ) where rnum > y select * from ( select * from table ) where rownum < x and x > y 这两个查询返回不同的行 这两个查询都不是确定性的。所以这两个查询都不应该在实际系统中使用 第一个查询似乎至少尝试生成x和y之间的

这两种编码技术的优缺点是什么

select * from (
    select rownum rnun, * from table where rownum < x
) where rnum > y


select * from (
    select * from table
) where rownum < x and x > y

这两个查询返回不同的行

这两个查询都不是确定性的。所以这两个查询都不应该在实际系统中使用

第一个查询似乎至少尝试生成x和y之间的行窗口。但是,由于没有ORDERBY,因此行的顺序是不确定的,窗口可能不会执行您想要的操作

第二个查询返回任意x行数据,假设x>y。否则,如果y>=x,则返回0行。如果您试图构建某种类型的窗口查询,那么这不是它

如果您想要一个有效的窗口查询,您可能需要

SELECT *
  FROM (SELECT a.*,
               row_number() over (order by something) rnum
          FROM table_name)
 WHERE rnum BETWEEN x AND y
SELECT *
  FROM (SELECT a.*,
               rownum rnum
          FROM( SELECT b.*
                  FROM table_name
                 ORDER BY something) a)
 WHERE rownum < y
   AND rnum > x
如果您想使用ROWNUM,您需要

SELECT *
  FROM (SELECT a.*,
               row_number() over (order by something) rnum
          FROM table_name)
 WHERE rnum BETWEEN x AND y
SELECT *
  FROM (SELECT a.*,
               rownum rnum
          FROM( SELECT b.*
                  FROM table_name
                 ORDER BY something) a)
 WHERE rownum < y
   AND rnum > x

但这往往比分析查询方法效率低。

这两个查询返回不同的行

这两个查询都不是确定性的。所以这两个查询都不应该在实际系统中使用

第一个查询似乎至少尝试生成x和y之间的行窗口。但是,由于没有ORDERBY,因此行的顺序是不确定的,窗口可能不会执行您想要的操作

第二个查询返回任意x行数据,假设x>y。否则,如果y>=x,则返回0行。如果您试图构建某种类型的窗口查询,那么这不是它

如果您想要一个有效的窗口查询,您可能需要

SELECT *
  FROM (SELECT a.*,
               row_number() over (order by something) rnum
          FROM table_name)
 WHERE rnum BETWEEN x AND y
SELECT *
  FROM (SELECT a.*,
               rownum rnum
          FROM( SELECT b.*
                  FROM table_name
                 ORDER BY something) a)
 WHERE rownum < y
   AND rnum > x
如果您想使用ROWNUM,您需要

SELECT *
  FROM (SELECT a.*,
               row_number() over (order by something) rnum
          FROM table_name)
 WHERE rnum BETWEEN x AND y
SELECT *
  FROM (SELECT a.*,
               rownum rnum
          FROM( SELECT b.*
                  FROM table_name
                 ORDER BY something) a)
 WHERE rownum < y
   AND rnum > x

但这往往不如分析查询方法有效。

除了缺少“order by”子句之外…。。 问题可能是关于Oracle STOPKEY功能的?在“分页”查询的情况下,Oracle可以使用STOPKEY功能来限制子查询中的行数,这可能会带来一些性能提升

看看这个查询:

select *
  from (select a.*,
               row_number() over (order by sname) rnum
          from t_patient_card a)
 where rnum between 1 and 100           

                                                        Cost    Cardinality

SELECT STATEMENT, GOAL = FIRST_ROWS                     313272  3571266
 VIEW        HOSPITAL2$                                 313272  3571266
  SORT ORDER BY                                         313272  3571266
   COUNT
  TABLE ACCESS FULL    HOSPITAL2$    T_PATIENT_CARD     38883   3571266
Oracle在只返回100行之前获取了所有行

让我们像这样重写查询:

select *
  from (
  select rownum as rn,tt.*  from  
  (
   select  t.* from t_patient_card t order by  t.sname
  )tt where rownum<100       
    ) 
 WHERE rn >1

在此步骤后,您可以看到“count stopkey”,基数仅为99。在我的数据库中,第二个查询的执行速度比第一个查询快一秒。

除了缺少“order by”子句之外…。。 问题可能是关于Oracle STOPKEY功能的?在“分页”查询的情况下,Oracle可以使用STOPKEY功能来限制子查询中的行数,这可能会带来一些性能提升

看看这个查询:

select *
  from (select a.*,
               row_number() over (order by sname) rnum
          from t_patient_card a)
 where rnum between 1 and 100           

                                                        Cost    Cardinality

SELECT STATEMENT, GOAL = FIRST_ROWS                     313272  3571266
 VIEW        HOSPITAL2$                                 313272  3571266
  SORT ORDER BY                                         313272  3571266
   COUNT
  TABLE ACCESS FULL    HOSPITAL2$    T_PATIENT_CARD     38883   3571266
Oracle在只返回100行之前获取了所有行

让我们像这样重写查询:

select *
  from (
  select rownum as rn,tt.*  from  
  (
   select  t.* from t_patient_card t order by  t.sname
  )tt where rownum<100       
    ) 
 WHERE rn >1

在此步骤后,您可以看到“count stopkey”,基数仅为99。在我的数据库中,第二个查询的执行速度比第一个查询快一秒。

闻起来像。。。家庭作业?什么版本的oracle?看看执行计划,看看它们是否有什么不同。@Adrian-我希望这不是家庭作业,因为在这种情况下,需要更换讲师。闻起来像。。。家庭作业?什么版本的oracle?看看执行计划,看看它们是否有什么不同。@Adrian-我希望这不是家庭作业,因为在这种情况下,需要更换讲师。