ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【实验】【SQL】排序与rownum的关系暨利用rownum处理一实际需求

【实验】【SQL】排序与rownum的关系暨利用rownum处理一实际需求

原创 Linux操作系统 作者:secooler 时间:2009-09-04 12:30:46 0 删除 编辑
这个实验将会得出如下几个结论:
1. Oracle 10g数据库以select * 方式获取数据的顺序基本上是以初始化到数据库的顺序显示的;
2. Oracle 10g数据库以select * 方式获取数据不会进行排序,只有在使用order by的情况下才能保证数据的顺序;
3. 若实现rownum与数据递增顺序保持同步,这里给出一个使用子查询的方式的实现方式。

实验BEGIN:
1.创建一个简单的测试表t,只包含一列x
sec@ora10g> create table t (x varchar2(30));

Table created.

2.初始化测试表t的数据,注意这里数据初始化顺序(a,d,c,b)
sec@ora10g> insert into t values ('a');
sec@ora10g> insert into t values ('d');
sec@ora10g> insert into t values ('c');
sec@ora10g> insert into t values ('b');
sec@ora10g> commit;

3.验证结论1和2,select * 方式获取数据的顺序基本上是以初始化到数据库的顺序显示的,没有顺序
sec@ora10g> select * from t;

X
------------------------------
a
d
c
b

4.观察一下此时rownum和数据的顺序关系
sec@ora10g> select rownum,t.* from t;

    ROWNUM X
---------- ------------------------------
         1 a
         2 d
         3 c
         4 b

5.对数据列x进行主动排序后,观察一下rownum与数据列x的顺序,这里rownum的顺序是混乱的
sec@ora10g> select rownum,t.* from t order by 2;

    ROWNUM X
---------- ------------------------------
         1 a
         4 b
         3 c
         2 d

6.实现结论3,可以通过下面这个子查询的方法得到一个rownum与有序的数据列x保持一致的递增顺序
sec@ora10g> select rownum,tt.x from ( select x from t order by x) tt;

    ROWNUM X
---------- ------------------------------
         1 a
         2 b
         3 c
         4 d

7.如何在实际中应用这个实验结论
举一个利用这个结论来解决最近项目组的一个SQL需求的例子。
需求如下:要求按照x的递增顺序,更新描述字段为“DESCRIPTION-0001”样式的递增内容,“DESCRIPTION-”是固定的,“0001”是四位表示的序列号
实现需求如下:
1)在t表中添加一个描述字段y
sec@ora10g> alter table t add y varchar2(30);

Table altered.

2)使用如下的SQL语句即可完成需求(如果觉得这个SQL不好理解的话,可以先创建一个中间表,再关联这个中间表更新表t,其实下面的SQL思路是一样的,只是使用了一条SQL语句来实现)
sec@ora10g> UPDATE t
  2     SET y = (SELECT tt.y
  3                FROM (SELECT x, 'DESCRIPTION-' || LPAD (ROWNUM, 4, '0') y
  4                        FROM (SELECT   x
  5                                  FROM t
  6                              ORDER BY x)) tt
  7               WHERE tt.x = t.x);

4 rows updated.

3)最后确认数据已经按照需求修改成功
sec@ora10g> select * from t;

X                              Y
------------------------------ ------------------------------
a                              DESCRIPTION-0001
d                              DESCRIPTION-0004
c                              DESCRIPTION-0003
b                              DESCRIPTION-0002

通过上面的这种方法就可以既利用到了rownum,又避免因默认无法排序问题导致更新错误的问题了。

-- The End --

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/519536/viewspace-613975/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE 总监,阿里云MVP,北京大学理学硕士,恩墨学院创始人,教育专家,中国区 Cloudera 首位官方授权大数据讲师,金牌培训专家,BDA大数据联盟创始人,OCM联盟创始人,ACCUG创始人、ACOUG核心专家,Blogger。

注册时间:2008-03-16

  • 博文量
    797
  • 访问量
    7992150