先排序还是先取值

先排序还是先取值

题目:  MS SQLSERVERORACLE中取出表中按照某字段排序的前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

 

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

   

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

下面的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条记录的集合MINUSM-1条记录的集合得到

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

 

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

 

 

                                      Black_Snail

Python字典是一种无序的数据结构,它的键值对是没有特定顺序的。但是,如果我们要对字典的键进行排序并获取对应的值,我们可以使用一些方法。 首,我们可以使用内置的sorted()函数对字典的键进行排序,并将排序后的键存储在一个列表中。然后,我们可以使用列表中的键来访问字典中对应的值。 示例代码如下所示: ``` # 定义一个字典 my_dict = {'apple': 5, 'orange': 3, 'banana': 2} # 对字典的键进行排序,存储在一个列表中 sorted_keys = sorted(my_dict) # 遍历排序后的键,并获取对应的值 for key in sorted_keys: value = my_dict[key] print(key, value) ``` 输出结果为: ``` apple 5 banana 2 orange 3 ``` 上述代码中,我们首定义了一个字典`my_dict`,它包含了水果的名称和对应的数量。然后,我们使用sorted()函数对字典的键进行排序,并将排序后的键存储在`sorted_keys`列表中。最后,我们使用for循环遍历排序后的键,并使用键来获取字典中对应的值,并进行打印输出。 需要注意的是,字典的排序是根据键的文本顺序进行的,默认按照键的升序进行排序。如果需要按照其他方式排序,可以通过传递参数给sorted()函数实现,例如使用`sorted(my_dict, key=my_dict.get, reverse=True)`来按照值的降序排序。 总结起来,对于Python字典排序取值,可以使用sorted()函数对字典的键进行排序,并将排序后的键存储在列表中,然后通过遍历排序后的键来获取字典中对应的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值