- 浏览: 468719 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
mrshen:
很棒,在其他大神的博客上理清了思路看懂之后,来lz这里用例子学 ...
RED-BLACK(红黑)树的实现TreeMap源码阅读 -
a939639017:
yanf4j check不下来 ?
Java nio 2.0 AIO -
hellostory:
又是抄来的 - -
mysql分表方案 -
davidluoye:
为什么不说下支持的数据库呢?
模糊查询的优化 -
oliveevilo:
表示没看懂
Synchronized和java.util.concurrent.locks.Lock的区别
引用
--该测试脚本可以直接运行
--现在想把数据库中数据按照固定字段分组相加,这里总结了三种方法。
--创建测试表、添加测试数据
Sql代码
create table test(id varchar2(10),mc varchar2(50));
insert into test values('1','11111');
insert into test values('1','22222');
insert into test values('2','11111');
insert into test values('2','22222');
insert into test values('3','11111');
insert into test values('3','22222');
insert into test values('3','33333');
commit;
create table test(id varchar2(10),mc varchar2(50));
insert into test values('1','11111');
insert into test values('1','22222');
insert into test values('2','11111');
insert into test values('2','22222');
insert into test values('3','11111');
insert into test values('3','22222');
insert into test values('3','33333');
commit;
--方法一:
Sql代码
set serveroutput on size 1000000
declare
union_mc varchar2(200);
begin
for cur_a in(select distinct id from test) loop
for cur_b in(select mc from test where id=cur_a.id) loop
union_mc:=union_mc||cur_b.mc;
end loop;
dbms_output.put_line(cur_a.id||chr(9)||union_mc);
union_mc := '';
end loop;
end;
/
set serveroutput on size 1000000
declare
union_mc varchar2(200);
begin
for cur_a in(select distinct id from test) loop
for cur_b in(select mc from test where id=cur_a.id) loop
union_mc:=union_mc||cur_b.mc;
end loop;
dbms_output.put_line(cur_a.id||chr(9)||union_mc);
union_mc := '';
end loop;
end;
/
--方法二:
Sql代码
CREATE OR REPLACE function link(v_id varchar2) return varchar2 is
union_mc varchar2(200);
begin
for cur in (select mc from test where id = v_id) loop
union_mc := union_mc || cur.mc;
end loop;
union_mc := rtrim(union_mc, 1);
return union_mc;
end;
select id,link(id) from test group by id;
/
CREATE OR REPLACE function link(v_id varchar2) return varchar2 is
union_mc varchar2(200);
begin
for cur in (select mc from test where id = v_id) loop
union_mc := union_mc || cur.mc;
end loop;
union_mc := rtrim(union_mc, 1);
return union_mc;
end;
select id,link(id) from test group by id;
/
--方法三:
/*从Oracle 9i开始,开发者可以创建用户自定义的合计函数,除了PL/SQL外,还可以使用任何Oralce所支持的语言(如C++或者Java)来创建合计函数。TYPE头定义必须包含ODCIAggregateInitialize、ODCIAggregateIterate、ODCIAggregateMerge和ODCIAggregateTerminate这四个接口函数。*/
/*Initialize函数对数据组各个需要处理的字段各运行一次。自然的,我需要为每一个值准备一个新的清单,所以需要初始化持久变量list,这里初始化值为null。*/
/*Iterate函数处理返回的行,所以实际上是由它来创建返回的值的清单。先测试list是否为空,如果为空,就把list直接设置为所引入的value值;如果list变量非空,则给list添加一个逗号后再插入value值,list的最大允许字符数32767。*/
/*Terminate函数在数据组的每个行的感兴趣字段数据被处理后执行。在这个函数中我只需简单的返回清单变量即可。*/
/*Merge函数,用来返回成功标记的。*/
/*创建自己的合计函数扩展了Oracle统计和文本处理能力。*/
Sql代码
create or replace type t_cat as object
(
union_mc VARCHAR2(200),
static function ODCIAggregateInitialize(sctx IN OUT t_cat) return number,
member function ODCIAggregateIterate(self IN OUT t_cat,
value IN varchar2) return number,
member function ODCIAggregateTerminate(self IN t_cat,
returnValue OUT varchar2,
flags IN number)
return number,
member function ODCIAggregateMerge(self IN OUT t_cat, ctx2 IN t_cat)
return number
)
;
create or replace type body t_cat is static function ODCIAggregateInitialize(sctx IN OUT t_cat) return number is begin sctx := t_cat(''); return ODCIConst.Success; end;
member function ODCIAggregateIterate(self IN OUT t_cat, value IN varchar2) return number is begin self.union_mc := self.union_mc || value; return ODCIConst.Success; end;
member function ODCIAggregateTerminate(self IN t_cat, returnValue OUT varchar2, flags IN number) return number is begin returnValue := self.union_mc; return ODCIConst.Success; end;
member function ODCIAggregateMerge(self IN OUT t_cat, ctx2 IN t_cat) return number is begin return ODCIConst.Success; end; end;
/
create or replace type t_cat as object
(
union_mc VARCHAR2(200),
static function ODCIAggregateInitialize(sctx IN OUT t_cat) return number,
member function ODCIAggregateIterate(self IN OUT t_cat,
value IN varchar2) return number,
member function ODCIAggregateTerminate(self IN t_cat,
returnValue OUT varchar2,
flags IN number)
return number,
member function ODCIAggregateMerge(self IN OUT t_cat, ctx2 IN t_cat)
return number
)
;
create or replace type body t_cat is static function ODCIAggregateInitialize(sctx IN OUT t_cat) return number is begin sctx := t_cat(''); return ODCIConst.Success; end;
member function ODCIAggregateIterate(self IN OUT t_cat, value IN varchar2) return number is begin self.union_mc := self.union_mc || value; return ODCIConst.Success; end;
member function ODCIAggregateTerminate(self IN t_cat, returnValue OUT varchar2, flags IN number) return number is begin returnValue := self.union_mc; return ODCIConst.Success; end;
member function ODCIAggregateMerge(self IN OUT t_cat, ctx2 IN t_cat) return number is begin return ODCIConst.Success; end; end;
/
/*如果你的Oracle服务器没有配置成支持并行处理的方式,可以去掉参数PARALLEL_ENABLE*/
Sql代码
create or replace function catstr(v_mc varchar2) return varchar2
PARALLEL_ENABLE
AGGREGATE USING t_cat;
/
select id, catstr(mc) from test group by id;
create or replace function catstr(v_mc varchar2) return varchar2
PARALLEL_ENABLE
AGGREGATE USING t_cat;
/
select id, catstr(mc) from test group by id;
方法四:
Sql代码
select id,
mc,
row_number() over(partition by id order by id) rn_by_id,
row_number() over(order by id) + id rn
from test;
select id,
mc,
row_number() over(partition by id order by id) rn_by_id,
row_number() over(order by id) + id rn
from test;
/*
利用分析函数,构造两列,做为连接的条件:按照id分组,RN-1等于PRIOR RN作为条件连接。
ID MC RN_BY_ID RN
---------- -------------------------------------------------- ---------- ----------
1 11111 1 2
1 22222 2 3
2 11111 1 5
2 22222 2 6
3 11111 1 8
3 22222 2 9
3 33333 3 10
*/
Sql代码
select id, ltrim(max(sys_connect_by_path(mc, ';')), ';') add_mc
from (select id,
mc,
row_number() over(partition by id order by id) rn_by_id,
row_number() over(order by id) + id rn
from test)
start with rn_by_id = 1
connect by rn - 1 = prior rn
group by id
order by id;
select id, ltrim(max(sys_connect_by_path(mc, ';')), ';') add_mc
from (select id,
mc,
row_number() over(partition by id order by id) rn_by_id,
row_number() over(order by id) + id rn
from test)
start with rn_by_id = 1
connect by rn - 1 = prior rn
group by id
order by id;
/*
另用sys_connect_by_path函数实现字符串的连接,把最左边的分号去掉,即得到我们想要的结果
ID ADD_MC
---------- --------------------------------------------------------------------------------
1 11111;22222
2 11111;22222
3 11111;22222;33333
*/
Sql代码
select * from test;
select * from test;
方法四的另一种写法
估计类似的写法还有很多,这个和上一个不同在于用的没有带有start with(filter功能)的connect,并借助level和first_value来实现。
Sql代码
SELECT distinct id,
ltrim(first_value(mc_add)
over(partition by id order BY l DESC),
';')
from (SELECT id, LEVEL l, sys_connect_by_path(mc, ';') mc_add
from (select id || rownum rn, id || rownum - 1 rn_small, id, mc
from test)
CONNECT BY PRIOR rn = rn_small);
SELECT distinct id,
ltrim(first_value(mc_add)
over(partition by id order BY l DESC),
';')
from (SELECT id, LEVEL l, sys_connect_by_path(mc, ';') mc_add
from (select id || rownum rn, id || rownum - 1 rn_small, id, mc
from test)
CONNECT BY PRIOR rn = rn_small);
变换一下:(考虑id不是数字的情况)
Sql代码
select id, ltrim(max(sys_connect_by_path(mc, ';')), ';')
from (select id,
mc,
row_number() over(partition by id order by id) id1,
row_number() over(order by id) + dense_rank() over(order by id) id2
from test)
start with id1 = 1
connect by prior id2 = id2 - 1
group by id
order by id;
发表评论
-
navicat快捷键
2013-01-05 09:47 13881.ctrl+q 打开查询窗口2.ctrl ... -
mysql分表方案
2012-09-05 22:29 9103一、 概述分表是个目前算是比较炒的比较流行的概念,特别是在 ... -
mysql扩展至分库分表
2012-09-05 21:47 4045MySQL互联网Oracle企业应 ... -
批量修改SEQUENCE,序列同时增加10000
2012-06-26 16:40 1635select 'alter sequence ' || t1. ... -
oracle执行计划
2011-08-23 14:13 1173本文全面详细介绍oracle执行计划的相关的概念,访问数据 ... -
Oracle分页,Oracle中rownum与rowid的理解
2011-08-15 21:33 1878一、 oracle ... -
oracle--如何分析执行计划
2011-08-15 21:31 4256例1: 假设LARGE_TABLE ... -
Oracle优化----索引原理篇
2011-08-15 21:22 9962006-04-04 15:09 1561人阅读 评论(0) ... -
ORACLE执行计划
2011-06-22 17:27 15071 ,什么是执行计划 所谓执行计划,顾名思义,就是对一 ... -
MYSQL 字符
2011-04-23 00:05 1037因为不知道什么时候 ... -
ORACLE用户管理
2011-04-22 14:40 1396这里将介绍Oracle修改用户权限的实现过程,包括一些权限管 ... -
数据库表设计细节
2011-04-11 22:48 1965数据库建表原则 数据 ... -
数据库设计的14个技巧
2011-04-11 22:19 10021. 原始单据与实体之间的关系 可以是一对一、一对多、多对 ... -
ORACLE xmltype 遍历
2011-03-14 16:05 1992DECLARE var XMLType; ... -
ORACLE EXCEPTION总结
2011-03-14 14:53 1414文章分类:数据库 关键字: oracle 一 ORACLE ... -
Oracle存储过程解析XML,并把数据持久化
2011-03-14 14:52 1905需要解析的xml文件:people.xml 1 < ... -
oracle对大对象类型操作:blob,clob,nclob,bfile
2011-03-14 14:49 18473-4 Lob类型 ... -
impdp expdp使用小结
2011-03-11 17:29 2306\ 最近我们迁移数据库,其中涉及到了数据迁移 sql ... -
oracle表空间限额不足问题解决
2011-03-11 16:37 1297web程序访问数据库是,总是报 表空间“hnsd”限额不 ... -
ORACLE JOB
2011-03-11 15:56 1175、设置初始化参数 job_qu ...
相关推荐
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其试题涵盖了众多关键知识点。以下是一些基于题目内容的关键点解析: 1. Oracle默认安装时,账户`SYS`、`SYSTEM`和`SYSMAN`都是解锁的,但`SCOTT`账户通常...
在Oracle数据库中,计算时间差通常涉及到日期和时间的运算,特别是当需要精确到毫秒级别时,操作就显得相对复杂。Oracle提供了多种函数来处理日期和时间数据,如TO_DATE和TO_TIMESTAMP,但它们的功能有限,无法直接...
INSTR 函数返回字符串中的开始字符(左起),相当于 SQL 服务器的 CHARINDEX 函数。LPAD 函数填充字符串的左边,但 SQL 服务器中没有对应的函数。LTRIM 函数清除开始的空白,RTRIM 函数清除尾部的空白,两者在 SQL ...
Oracle数据库系统中包含丰富的函数,这些函数在数据处理和查询中起着至关重要的作用。以下是关于Oracle函数的详细介绍: 1. **日期运算及函数** - Oracle默认的日期格式是dd MM RR,日期可以直接相加减,例如:`...
- Oracle 使用 `TO_DATE(string, format_mask)` 将字符串转换为日期。 - SQL Server 使用 `CONVERT(date, string, style)`,其中 `style` 参数定义日期格式。 8. **NULL 处理**: - Oracle 的 `NVL(date_column,...
以上介绍的是SQL的基本概念和技术要点,这些是理解和掌握Oracle数据库的关键。 #### 十三、连接查询 **连接查询**用于从两个或多个表中获取数据。 ##### 1. SQL92语法 使用老式语法进行连接: ```sql SELECT * ...
选项D的s+()试图将字符串与空元组相加,同样会产生错误。 8. 在Access中,实体通常用表来表示,记录是表中的每一条数据,字段是记录的组成部分,域可能是指数据类型。 9. 视图在Visual FoxPro中不会以独立的文件...
Oracle时间函数是数据库管理系统Oracle中处理日期和时间的...以上就是Oracle时间函数`SYSDATE`的一些基本用法和相关的日期处理技巧,理解并熟练运用这些函数,能极大地提高在Oracle数据库中处理日期和时间数据的效率。
15. **字符串连接**:`System.out.println("5" + 2)`的输出结果是`7`,因为Java中字符串与数字相加会进行隐式转换,数字转为字符串后再拼接。 16. **程序输出**:未给出完整代码,无法确定确切答案。 17. **检查型...
24. Java字符串操作:在Java中,String对象是不可变的,因此不能直接用加法运算符与数字相加。B选项s = s + 100是非法的,因为不能直接将字符串与整数相加。 以上就是这些试题所涵盖的计算机二级等级考试相关知识点...
保存在oracle数据库中的所有操作细节: spool oracleday01.txt :开始记录 spool off :开始保存细节 四、SELECT语句:选择操作、投影操作。 select:从一个或多个表中检索一个或多个数据列。包含信息:想选择...
Oracle的NVL函数是数据库操作中非常常用的一个函数,它主要用于处理NULL值,尤其是在处理包含NULL的查询和更新语句时。NVL函数的基本概念是,如果提供的第一个表达式(eExpression1)的计算结果为NULL,那么它将返回...
**解析**:在Java中,当字符串与数值相加时,数值会被转换成字符串形式再进行拼接。因此,输出结果为`java2`。 #### 2. 继承性概念 **题目描述**:程序中子类拥有的成员数目一定大于等于父类拥有的成员数目。 **...
System.out.printf() 可插入带 % 的输入类型,前两种只可以插入转义符, 不能插入 % 的数据或字符串 在 printf 里面,输出有5个部分 %[argument_index$][flags][width][.precision]conversion 以“%”开头,[第几个...