您的位置:首页 > 其它

用wm_concat 生成索引引用的字段

2012-12-11 15:03 330 查看
要到了要清理和整理数据库的时期了,看到那一对对的表和索引,感觉就像一团麻一样。没多一段时间就需要清理下。

1. 这段时间又增加了多少个表。

2.这段时间有修改了多少个表。

3.还有索引,又建了多少个索引。命名是否有规则。

因为目前的数据库是数据仓库,所以在索引方面希望能名称标准化,而且能批量检查和添加。知道oracle有wm_concat函数,于是google了下,有了下面的方案。

with sql_tmp as

(select INDEX_NAME,

wm_concat(COLUMN_POSITION) over(partition by INDEX_NAME order by COLUMN_POSITION) COLUMN_POSITION,

wm_concat(COLUMN_NAME) over(partition by INDEX_NAME order by COLUMN_NAME) COLUMN_NAME

from user_ind_columns)

select INDEX_NAME, max(COLUMN_POSITION), max(COLUMN_NAME)

from sql_tmp

group by INDEX_NAME

;



参考如下:

wm_concat在行转列的时候非常有用,但在行转列的过程中的排序问题常常难以控制。

可见下面例子:

准备测试表:

drop table t;

create table t (n number,m number);

insert into t values(1,1);

insert into t values(5,3);

insert into t values(3,3);

insert into t values(6,5);

insert into t values(7,2);

insert into t values(2,2);

insert into t values(0,1);

insert into t values(11,1);

insert into t values(15,3);

insert into t values(13,3);

insert into t values(16,5);

insert into t values(17,2);

insert into t values(12,2);

insert into t values(10,1);

commit;

SQL> select * from t order by 2,1;

N M

———- ———-

0 1

1 1

10 1

11 1

2 2

7 2

12 2

17 2

3 3

5 3

13 3

15 3

6 5

16 5

测试wm_concat后的顺序:

测试1:

SQL> select m,wm_concat(n) from t group by m;

M WM_CONCAT(N)

———- ——————————————————————————–

1 11,0,1,10

2 17,2,7,12

3 15,3,5,13

5 16,6

可见wm_concat后的顺序并没有按大->小,或小->大的顺序。

测试2:

–参考网上一些解决思路

SQL> select m,wm_concat(n)

2 from (select n,m from t order by m,n )

3 group by m;

M WM_CONCAT(N)

———- ——————————————————————————–

1 0,11,10,1

2 2,17,12,7

3 3,15,13,5

5 6,16

可见顺序问题还是没有解决

最终解决思路:

SQL> select m, max(r)

2 from (select m, wm_concat(n) over (partition by m order by n) r from t)

3 group by m ;

M MAX(R)

———- ——————————————————————————–

1 0,1,10,11

2 2,7,12,17

3 3,5,13,15

5 6,16
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐