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');
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
当然也可以事先稍微处理一下:
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
3 Insert into (这个就不赘述了)
这里只是就这个问题,给出了一个事先办法,当然条条大罗通罗马。 总之,需求千变万化,本质的东西永远就那些,多思考,多探究,多实践。