rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数.oracle在select出一条记录后便加上一个rownum, 而不等所有的结果都select出来后再加上rownum。
然后是distinct的工作原理。distinct是等记录集全部查询出后,然后进行排序,最后再删除重复数据,而不是边查边删除重复数据,因为这是不切实际的,毕竟又太多的位置数据。
所以会出现这样的情况:
SQL> select distinct customerid from cn;
CUSTOMERID
----------------------------------------
005
004
008
002
006
001
007
003
已选择8行。
SQL> select distinct customerid
2 from cn
3 where rownum < 8;
CUSTOMERID
----------------------------------------
002
001
003
已选择3行。
这是因为在第二个sql查询时,先返回了前7个结果,然后才进行去重。如果想得到不重复的前7个结果,需要使用嵌套查询
SQL> select *
2 from
3 ( select distinct customerid
4 from cn
5 )
6 where rownum < 8;
CUSTOMERID
----------------------------------------
001
002
003
004
005
006
007
已选择8行。