mysql中group_concat和oracle中LISTAGG
分别在mysql和oracle创建下面两个表 建表语句来源借鉴
create table plan (
id int PRIMARY key,
name varchar(255)
);
-- 创建一个计划明细表,是计划表的子表
create table planDetail(
id int PRIMARY key,
name varchar(255),
state int,
planId int
);
-- 插入数据
insert into plan values(1,'计划一');
insert into plan values(2,'计划二');
insert into plan values(3,'计划三');
insert into planDetail values(1,'明细一',0,1);
insert into planDetail values(2,'明细2',1,1);
insert into planDetail values(3,'明细3',1,1);
insert into planDetail values(4,'明细一',0,2);
insert into planDetail values(5,'明细2',0,2);
insert into planDetail values(6,'明细3',1,2);
insert into planDetail values(7,'明细一',1,3);
insert into planDetail values(8,'明细2',1,3);
insert into planDetail values(9,'明细3',1,3);
排序用法------------------------------------------------------
-- mysql用法
select t1.name ,group_concat(t2.name order by PLANID asc) from plan t1
LEFT JOIN planDetail t2 on T1.id = T2.planid
GROUP BY T1.name
-- oracle达到相同效果的用法
select t1.name ,LISTAGG(t1.name,',') within GROUP (order by t2.planid asc) from plan t1
LEFT JOIN planDetail t2 on T1.id = T2.planid GROUP BY T1.name
效果如下;
计划一 明细3,明细2,明细一
计划三 明细3,明细2,明细一
计划二 明细3,明细2,明细一
--------------------------------------------------------
不排序用法
--- mysql
select t1.name ,group_concat(t2.name) from plan t1 LEFT JOIN planDetail t2 on T1.id = T2.planid GROUP BY T1.name
效果如下:
计划一 明细一,明细2,明细3
计划三 明细一,明细2,明细3
计划二 明细2,明细3,明细一
----oracle
select t1.name ,wm_concat(t2.name) from plan t1 LEFT JOIN planDetail t2 on T1.id = T2.planid GROUP BY T1.name
效果如下:
计划二 明细一,明细3,明细2
计划三 明细一,明细3,明细2
计划一 明细一,明细3,明细2