人生就是如此
===========================================================
如果让查询出来的数据和in中列表顺序一致
===========================================================
需求是公司一开发人员提出来的,一下想到了in的绑定的思想,决定尝试利用 in list 绑定+nl。

首先创建type和函数,分数字类型和字符类型两种:

create or replace type numTableType as table of number;


create or replace  type vartabletype is    table of varchar2(2000);
   


create or  replace function str2varList( p_string in varchar2 ) return VarTableType
 as
 v_str long default p_string || ',';
 v_n varchar2(2000);
 v_data VarTableType := VarTableType();
 begin
        loop
                v_n :=instr( v_str, ',' );
        exit when (nvl(v_n,0) = 0);
        v_data.extend;
        v_data( v_data.count ) := ltrim(rtrim(substr(v_str,1,v_n-1)));

        v_str := substr( v_str, v_n+1 );
        end loop;
        return v_data;
 end;
 

 
 
create or  replace function str2numList( p_string in varchar2 ) return numTableType
as
        v_str long default p_string || ',';
        v_n number;
        v_data numTableType := numTableType();
begin
        loop
        v_n := to_number(instr( v_str, ',' ));
        exit when (nvl(v_n,0) = 0);
        v_data.extend;
        v_data( v_data.count ) := ltrim(rtrim(substr(v_str,1,v_n-1)));
        v_str := substr( v_str, v_n+1 );
        end loop;
        return v_data;
end;

alibaba@OCN>  set  line  1000
set">alibaba@OCN>set pagesize 0
select">alibaba@OCN>select id,name from  resources where  id in (1200, 1201,1216,1217,1218,1202,1203,1213,1214,1215);
       1200 买
      1201 卖
      1202 代理
      1203 合作
      1213 GMT-12
      1214 GMT-11
      1215 GMT-10
      1216 GMT-9
      1217 GMT-8 太平洋时间(美国和加拿大)
      1218 GMT-7 山地时间(美国和加拿大)

10 rows selected.

select">alibaba@OCN>select /*+ordered use_nl(a b)*/  b.id ,b.name
  2     from table (str2numList('1200, 1201,1216,1217,1218,1202,1203,1213,1214,1215') ) a,
  3     resources b
  4     where a.column_value= b.id;  
      1200 买
      1201 卖
      1216 GMT-9
      1217 GMT-8 太平洋时间(美国和加拿大)
      1218 GMT-7 山地时间(美国和加拿大)
      1202 代理
      1203 合作
      1213 GMT-12
      1214 GMT-11
      1215 GMT-10

10 rows selected.

bitirainy 发表于:2005.02.21 16:47 ::分类: ( Oracle is anything ) ::阅读:(2278次) :: 评论 (10)
[回复]

估计这是最简单方便的方法了,否则就只能使用PL/SQL。

yangtingkun 评论于: 2005.02.21 18:45
[回复]

呵呵,蛮巧妙的

kamus 评论于: 2005.02.22 00:10
[回复]

Great.
开发的要求挺有挑战性的smile

玉面飞龙 评论于: 2005.02.22 12:26
[回复]

老大太厚道了,我们就叫RD去自己在程序里面搞去了,哈哈

adamyang 评论于: 2005.02.22 12:38
[回复]

呵呵,这种情况下当然是有索引的缘故才这么做的

yongtingkun 测试过 hash join的情况,发现也是符合要求的,但我估计数据量小的情况下才是可能符合的。随着数据量的增加,hash join 不敢保证稳定。

biti_rainy 评论于: 2005.02.24 13:08
[回复]

²»Êǵģ¬ÓÐË÷ÒýµÄ»°£¬Êä³ö³öÀ´µÄ½á¹û¸úË÷Òý˳ÐòÊÇÒ»ÑùµÄ£¬ÔÚ 9204ȱʡÇé¿öÏÂÊÇÕâÑùµÄ,Ö´Ðмƻ®ºÍÔçÆÚ°æ±¾²»Ò»ÑùÁË:
alibaba@OCN>select id||name from resources where id in (1200, 1201,1216,1217,1218,1202,1203,1213,1214,1215);
1200Âò
1201Âô
1202´úÀí
1203ºÏ×÷
1213GMT-12
1214GMT-11
1215GMT-10
1216GMT-9
1217GMT-8 ̫ƽÑóʱ¼ä£¨ÃÀ¹úºÍ¼ÓÄôó£©
1218GMT-7 ɽµØÊ±¼ä£¨ÃÀ¹úºÍ¼ÓÄôó£©

10 rows selected.

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=10 Bytes=1000
)

1 0 INLIST ITERATOR
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=3 Car
d=10 Bytes=1000)

3 2 INDEX (RANGE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=2
Card=10)

biti_rainy 评论于: 2005.02.24 17:15
repost [回复]

不是的,有索引的话,输出出来的结果跟索引顺序是一样的,在 9204缺省情况下是这样的,执行计划和早期版本不一样了:
alibaba@OCN>select id||name from resources where id in (1200, 1201,1216,1217,1218,1202,1203,1213,1214,1215);
1200买
1201卖
1202代理
1203合作
1213GMT-12
1214GMT-11
1215GMT-10
1216GMT-9
1217GMT-8 太平洋时间(美国和加拿大)
1218GMT-7 山地时间(美国和加拿大)

10 rows selected.

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=10 Bytes=1000
)

1 0 INLIST ITERATOR
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=3 Car
d=10 Bytes=1000)

3 2 INDEX (RANGE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=2
Card=10)

biti_rainy 评论于: 2005.02.24 17:16
[回复]

你这个索引是不是分析过了,能不能加个USE_CONCAT的hint试一下。

overtime 评论于: 2005.02.24 21:32
如你所眼:删除统计信息就倒过来了 [回复]

alibaba@OCN>set autotrace on
alibaba@OCN>analyze table resources delete statistics;

Table analyzed.

alibaba@OCN>set autotrace on
alibaba@OCN>select id||name from resources where id in (1200, 1201,1216,1217,1218,1202,1203,1213,1214,1215);

ID||NAME
----------------------------------------------------------------------------------------------------
1215GMT-10
1214GMT-11
1213GMT-12
1203合作
1202代理
1218GMT-7 山地时间(美国和加拿大)
1217GMT-8 太平洋时间(美国和加拿大)
1216GMT-9
1201卖
1200买

10 rows selected.

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 CONCATENATION
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES'
3 2 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE)
4 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES'
5 4 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE)
6 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES'
7 6 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE)
8 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES'
9 8 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE)
10 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES'
11 10 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE)
12 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES'
13 12 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE)
14 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES'
15 14 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE)
16 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES'
17 16 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE)
18 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES'
19 18 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE)
20 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES'
21 20 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE)

对表分析后使用hints,和上面一样,是倒过来的顺序

alibaba@OCN>select /*+USE_CONCAT*/ id||name from resources r where id in (1200, 1201,1216,1217,1218,1202,1203,1213,1214,1215);

ID||NAME
----------------------------------------------------------------------------------------------------
1215GMT-10
1214GMT-11
1213GMT-12
1203合作
1202代理
1218GMT-7 山地时间(美国和加拿大)
1217GMT-8 太平洋时间(美国和加拿大)
1216GMT-9
1201卖
1200买

10 rows selected.

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=20 Card=10 Bytes=130
)

1 0 CONCATENATION
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=2 Car
d=1 Bytes=13)

3 2 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=1
Card=1809)

4 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=2 Car
d=1 Bytes=13)

5 4 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=1
Card=1809)

6 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=2 Car
d=1 Bytes=13)

7 6 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=1
Card=1809)

8 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=2 Car
d=1 Bytes=13)

9 8 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=1
Card=1809)

10 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=2 Car
d=1 Bytes=13)

11 10 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=1
Card=1809)

12 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=2 Car
d=1 Bytes=13)

13 12 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=1
Card=1809)

14 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=2 Car
d=1 Bytes=13)

15 14 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=1
Card=1809)

16 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=2 Car
d=1 Bytes=13)

17 16 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=1
Card=1809)

18 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=2 Car
d=1 Bytes=13)

19 18 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=1
Card=1809)

20 1 TABLE ACCESS (BY INDEX ROWID) OF 'RESOURCES' (Cost=2 Car
d=1 Bytes=13)

21 20 INDEX (UNIQUE SCAN) OF 'RESOURCES_PK' (UNIQUE) (Cost=1
Card=1809)

biti_rainy 评论于: 2005.02.24 23:09
[回复]

thanks smile

biti_rainy 评论于: 2005.04.20 23:30

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)




切换风格
新闻聚合
博客日历
文章归档...
最新发表...
博客统计...
网站链接...