生活的沉淀态 希望的萌芽态 平静色|包容色|希望色
« »
2010-04-20软件电脑

阅读 460 次

distinct和rownum使用

首先,要明白rownum的真正含义。rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数.oracle在select出一条记录后便加上一个rownum,   而不等所有的结果都select出来后再加上rownum。

然后是distinct的工作原理。distinct是等记录集全部查询出后,然后进行排序,最后再删除重复数据,而不是边查边删除重复数据,因为这是不切实际的,毕竟又太多的位置数据。

有了对oracle这两个关键词的准确理解后,就不难弄清楚为什么,当distinct和rownum一起使用的时候就得不到想要的记录条数了,具体现象还是举例子说明吧,语言可能有点空洞。

一:先来看下面sql查询出的记录

select a.access_id, a.link_id
  from asn_access a, asn_res_link b
 where a.access_id = '000000000000000000035696'
   and a.link_id = b.link_id
   and a.delete_state = '0'
   and b.delete_state = '0'

这个SQL得到的记录集如下:

image

二:如果这个查询语句加上district的话,我想大家都知道,在oracle会返回两条记录:

select distinct a.access_id, a.link_id
  from asn_access a, asn_res_link b
 where a.access_id = '000000000000000000035696'
   and a.link_id = b.link_id
   and a.delete_state = '0'
   and b.delete_state = '0'

得到的结果如下图所示:

image

三:最后,如果再对这个sql进一步加上rownum限制条件的话,可能就有人不理解为什么得到的结果不是预期估计结果,比如,我们加上rownum<3,可能会觉得应该返回两条结果:

select distinct a.access_id, a.link_id
  from asn_access a, asn_res_link b
 where a.access_id = '000000000000000000035696'
   and a.link_id = b.link_id
   and a.delete_state = '0'
   and b.delete_state = '0'
   and rownum < 3

这个sql运行的结果确实只有一条记录,呵呵,为什么会这样,我想如果你对刚开始讲的那两点理解的话,对这个结果也就不会感到意外了:

image

只要稍微分析一下就知道为什么会出现这样的结果了。

1.首先rownum对查询出来的4条记录标号,第一条为1,第二条为2,到第三条的时候因为rownum<3条件为false,查询停止;

2.然后distinct开始工作,因为第1,2条记录重复,所以删除一条(具体是删除哪条就不太清楚了,但不是标号为1的被删除就是标号为2的被删除),这样一来,就只剩一条记录,满足rownum<3的记录就只有一条了;

如此一分析,我想就很清楚了,所以oracle的distinct和rownum一般不会这么使用。如果想得到不重复的两条记录一般都是采取子查询的方式,即,先distinct返回结果,然后在rownum限制一下:

select c.access_id, c.link_id
  from (select distinct a.access_id, a.link_id
          from asn_access a, asn_res_link b
         where a.access_id = ’000000000000000000035696′
           and a.link_id = b.link_id
           and a.delete_state = ’0′
           and b.delete_state = ’0′) c
 where and rownum < 3

日志信息 »

该日志于2010-04-20 18:29由 世纪之光 发表在软件电脑分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

相关日志 »

12条评论

  1. 刘晓林 说道:

    我先占个沙发吧,代码的我是看不懂

  2. 世纪之光 说道:

    sql跟代码区别还是很大的,属于第四代语言,简单的一腿的。

  3. 海天无影 说道:

    你都用oracle了
    我还在用access、SQL、MySQL

  4. laofan 说道:

    天书啊,我还是打酱油去吧

  5. 友情链接 说道:

    看的很是迷糊

  6. 北山 说道:

    看是看明白了,突然来一篇技术日志,有点不适应

  7. Smoock-online 说道:

    what I was looking for, thanks

  8. learn seo 说道:

    感谢伟大的信息!我也不会发现这一点,否则!

  9. 感谢您的帮助后!我也不会获得这样的,否则!

发表评论 »



楚天互联:美国高速主机月付3元起, 域名注册优惠中..

返回顶部