用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
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
相关文章推荐
- mysql 查询一个字段,生成连接字符串输出 统计函数 group_concat concat concat_ws
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
- lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3
- oracle中的wm_concat(column)函数使用(字段合并)
- lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3
- Oracle wm_concat 函数说明 如:wm_concat(column) 字段合并
- wmsys.wm_concat(字段)
- SQL_wm_concat函数实验:实现字段合并
- 15. "wm_concat"_数据库中将查询出来的多条记录中的某个字段用","拼接起来
- SQL_wm_concat函数实验:实现字段合并
- 存储过程系列二:适用函数wm_concat(column)函数实现字段合并
- wm_concat(字段名称)怎么用
- oracle 查看索引类别以及查看索引字段被引用的字段方法
- WP7 错误:未找到类型“local:XXX”。请确保不缺少程序集引用,并且已生成所有引用的程序集 解决办法
- MySQL-group_concat函数用法-生成签到日期序列
- sql2005(含“说明”字段)数据库设计文档自动生成方法
- T-Sql(八)字段索引和数据加密
- 【Oracle】wmsys.wm_concat函数字段值为空
- wm_concat的使用
- 编辑自定义字体及生成可引用的CSS文件