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

来源:互联网 发布:mac怎么使用投影仪 编辑:程序博客网 时间:2024/05/21 14:14

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

我采用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 (这个就不赘述了)

   

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


原创粉丝点击