读书人

SQL: group by 要会合的 是非数值字段

发布时间: 2012-11-25 11:44:31 作者: rapoo

SQL: group by 要聚合的 是非数值字段?

今天在技术群里面见别人问了一个问题:

我采用java的jdbc从表table1读出内容,然后对于id相同的用户,需要将prot合并插入到table2表中

table1:
id name age prot
7410 张三 20 23
7410 张三 20 88
7425 李四 23 22

table2:
id name age port
7410 张三 20 23/88
7425 李四 23 22

因为我采用的是批量更新的,所以不知道怎样合并port插入table2。


经过一番研究,给出SQL级别的 Oracle的解决方案(当然用程序处理是没问题的) 。会用到一些Oracle的函数


1 准备测试环境CREATE TABLE PERSON
( id NUMBER(*,0) NOT NULL ENABLE,
num NUMBER(*,0),
name VARCHAR2(30),
age NUMBER(*,0),
port VARCHAR2(50),
PRIMARY KEY (id

);

-- ----------------------------
-- Records of PERSON
-- ----------------------------
INSERT INTO PERSON VALUES ('1', '1001', 'abc', '22', '20');
INSERT INTO PERSON VALUES ('2', '1002', 'abc', '22', '20');
INSERT INTO PERSON VALUES ('3', '1001', 'abc', '22', '23');
INSERT INTO PERSON VALUES ('4', '1001', 'abc', '22', '15');
INSERT INTO PERSON VALUES ('5', '1002', 'abc', '22', '21');


SQL: group by 要会合的 是非数值字段


2 写SQLmerge数据

查了一下Oracle的版本

SQL*Plus: Release 11.1.0.7.0 - Production on Fri Nov 9 17:31:20 2012。

11.2.x 版本的Oracle可以如下写法:

select num,name, age listagg(port,'/') within group(order by port)
from person
group by num,name, age

具体参看官网文档:

http://www.oracle-developer.net/display.php?id=515


11.1.x及之前的版本可以如下写法(这种没有order by ):

select p.num, p.name, p.age, replace(WMSYS.WM_CONCAT(p.port),',','/')
from person p
group by p.num, p.name, p.age

SQL: group by 要会合的 是非数值字段

当然也可以事先稍微处理一下:

select p.num, p.name, p.age, replace(WMSYS.WM_CONCAT(p.port),',','/')
from ( select * from person order by port) p
group by p.num, p.name, p.age

SQL: group by 要会合的 是非数值字段


3 Insert into (这个就不赘述了)


这里只是就这个问题,给出了一个事先办法,当然条条大罗通罗马。 总之,需求千变万化,本质的东西永远就那些,多思考,多探究,多实践。


读书人网 >SQL Server

热点推荐