先排序还是先取值

排序

                                                          先排序还是先取值

 

题目:  MS SQLSERVER和ORACLE中取出表中按照某字段排序的前N条记录

 

这个题目看上去似乎那么简单, 两种数据库都提供ORDER BY 子句. 问题应该能够迎刃而解吧.

 

先试一下MS SQLSERVER是怎么做的:

     

use Northwind;

create table TestSort (ID integer);

insert into testSort values (3);

insert into testSort values (1);

insert into testSort values (4);

insert into testSort values (2);

select * from testSort;    

-----------------------------------------

ID         

-----------

3

1

4

2

(4 row(s) affected)

 

假设我们要取出按照ID排序的前三条记录:

    

select TOP 3 * from testSort order by ID ;       

-----------------------------------------

ID         

-----------

1

2

3

(3 row(s) affected) 

 

很简单,一句话就解决了.

 

再试一下ORACLE (这里用ORACLE9i)

SQL>  create table TestSort ( ID number);

Table created.

SQL> insert into testSort values (3);

1 row created.

SQL> insert into testSort values (1);

1 row created.

SQL> insert into testSort values (4);

1 row created.

SQL> insert into testSort values (2);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from testSort;

ID

----------

         3

         1

         4

         2

 

ORACLE没有MS SQLSERVER中取前N条记录的TOP语法. 但是有ROWNUM可以用来完成类似功能.

 

SQL> select * from TestSort where rownum <= 3 order by ID;

ID

----------

         1

         3

         4

 

结果是不是有点出乎意料? 它并没有返回所要求的 1 , 2 , 3的结果 . ORACLE先根据rownum <=3的条件限制选取一个范围集合(3,1,4), 然后再在这个集合里进行排序.

ORDER BY 子句是在合适的记录被取出后才起作用.

原来如此, 那么在ORACLE中如何才能实现这个功能呢?

通常我们可以采用这种办法:

SQL> select * from (select * from TestSort order by ID) where rownum <=3;

        ID

----------

         1

         2

         3

 

    有点麻烦,不过也只能这样.

   

相同道理, 如果想从表中取出按照某字段排序前M到N条记录

下面的ORACLE语句是最好的:

 

SQL> select ID from

     (

       select ID , rownum as con from

       (

        select ID  from TestSort order by ID

       )

       where rownum <= 3   /*N值*/

     )

     where con >= 2;  /*M 值*/

 

       

 

ID

----------

         2

         3

 

MS SQLSERVER中也可以用类似的思路解决此类问题.

 

当然你也可以用笨一点的办法, 比如用前N条记录的集合MINUS前M-1条记录的集合得到

前M到N条记录集合. (有点象饶口令) , 不过MS SQLSERVER好象不支持MINUS之类的集合操作.

 

看来小小的一个排序取值问题还真不是那么简单呢 !

 

 

                                      Black_Snail

                                      Ligang1000@hotmail.com

 

                                      欢迎交流,转贴请保留以上信息

时间: 2024-08-03 18:51:56

先排序还是先取值的相关文章

PostgreSQL 百亿级数据范围查询, 分组排序窗口取值 极致优化 case

本文将对一个任意范围按ID分组查出每个ID对应的最新记录的CASE做一个极致的优化体验.优化后性能维持在可控范围内,任意数据量,毫秒级返回,性能平稳可控.比优化前性能提升1万倍. CASE 有一张数据表,结构: CREATE TABLE target_position ( target_id varchar(80), time bigint, content text ); 数据量是 100 亿条左右 target_id 大约 20 万个 数据库使用的是 PostgreSQL 9.4 需求: 查

一个标签从标签数组中取值方法实现

问题描述 一个标签从标签数组中取值的两种方法实现.一种方法是按标签出次的次数取值按出现.String[]add={"北京","上海","四川","四川","北京","四川"};"地址":"四川";还有一个方法是按权重进行显示String[]add={"北京","上海","四川","

js实现hashtable的赋值、取值、遍历的教程

本文实例讲述了js实现hashtable的赋值.取值.遍历操作.分享给大家供大家参考,具体如下: 哈希表(Hashtable)这个概率应该是#c里面的概念,用来赋值.取值.遍历.排序操作提高效率.想起这个东西其实使我们以前经常遇到这样的面试题,一个很大的数组可能有100000个,如何快速知道它里面的出现最多的次数,那么这里我们可能就要用Hashtable的相关知识了.Javascript中,object的实现就是hash表,因此只要在object上封装点方法,再利用原生的hasOwnProper

40-.net如何从数据库中的一个表中取值

问题描述 .net如何从数据库中的一个表中取值 假设这是我数据库里的一张表(数据库是oracle),我该如何取得这些数将他们传给jsonObj.Rows,求教各位大神,能给个具体的实现过程吗? 解决方案 sonObj.Rows是你自己组装的json对象吧,你首先要查询数据库,这个自己看msdn把,很简单,获取值后开始组织json就行了 解决方案二: 自己读取数据后,通过服务器端代码赋值给aspx上的script标签就行,注意<%%>这种代码不能放js文件里面,必须是在aspx页面里面才能解析运

关于cookie的取值问题

问题描述 关于cookie的取值问题 代码如下: 我在cookie中能设置Age的值,也能取到,但是Name的值取的时候为空,是写的方式不对还是什么原因,求解! 解决方案 用fiddler调试下,感觉还是你的cookie根本没设置对.

设计-IO口控制MOS管驱动电路电阻的取值

问题描述 IO口控制MOS管驱动电路电阻的取值 用fpga的3.3V io口驱动mos管电路中,漏极上端与vcc连接的电阻怎么确定电阻值.mos管型号为BSS138P,设计时主要要看mos管datasheet中的那些参数! 解决方案 http://wenku.baidu.com/link?url=suzC-5Q4o80Ng0tj4uGrtXhetGG95XJMct5Fb6O9LKV9F_4JOYzGNXNsSrW5hp413fePi-RLHwVHV7B0iKONn8YmIfLEKc77lb_b1

CSS3技巧教程:css3的颜色取值方法

文章简介:CSS3技巧教程:css3的颜色取值方法. css颜色取值,大家对于css2版本以下颜色名称.十六进制技法.rgb记法.以上取值记法大家都和你熟悉,css3又有什么更另类的取值方法呢?RGBA.HSL.HSLA这三位大侠就是我们拭目以待的css3的颜色取值方法. RGBA即在css2版本中RGB记法增加了支持透明度的元素,语法也是相当容易理解:RGBA(255,0,0,0.5),这里的透明度,取值方范围在0-1. HSL玩过PS的童鞋应该对于这个HSL应该是很熟悉的,依次表达的意思是:

gridview 隐藏列取值

在用gridview时候,有时候想把其中一列隐藏,但是还想给他赋值或取值,但是如果visible 设置隐藏的话,   后台无法取值. 列的隐藏方式很多,都可以不影响取值,赋值. 1.protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)   {   //用CSS 隐藏列    e.Row.Cells[3].Style.Add( "display ", "none ")

Color Values颜色取值方法问题

css颜色取值,大家对于css2版本以下颜色名称.十六进制技法.rgb记法. 以上取值记法大家都和你熟悉,css3又有什么更另类的取值方法呢? RGBA.HSL.HSLA这三位大侠就是我们拭目以待的css3的颜色取值方法. RGBA 即在css2版本中RGB记法增加了支持透明度的元素,语法也是相当容易理解:RGBA(255,0,0,0.5),这里的透明度,取值方范围在0-1. HSL 玩过PS的童鞋应该对于这个HSL应该是很熟悉的,依次表达的意思是: H:Hue(色调).0(或360)表示红色,