前言
在写SQL语句的时候,有时候需要将多行的数据合并到一行上,比如在联合其他一对多的表的时候,或者在做group分组的时候。
举个例子,有一个部门表t_department(id, name)
,一个员工表t_staff(id, name, sex, department_id)
, 两者是一对多的关系,
- 需求1 select 部门表,以及部门里的员工的姓名,都逗号隔开:
1, '财务部','张三,李四,王五'
- 需求2 select 员工表,按男女分组,列出人名:
'男','张三,李四'
'女','王五'
MySQL的实现,利用GROUP_CONCAT
-- 联合其他表的情况(需求1) select id, (select group_concat(name) from t_staff t2 where t2.department_id=t1.id ) as names from t_department t1 -- 分组的情况(需求2) select sex, group_concat(name separator ',') from t_staff group by sex -- GROUP_CONCAT还可以排序,见下面的例子 SELECT GROUP_CONCAT(COLUMN_X SEPARATOR order by COLUMN_X asc ',') FROM <<table>> GROUP BY NULL
Oracle的实现,利用wm_concat、LISTAGG
见下面的例子
select grp, wmsys.wm_concat(str) from (select 1 grp, 'a1' str from dual union select 1 grp, 'a2' str from dual union select 2 grp, 'b1' str from dual union select 2 grp, 'b2' str from dual union select 2 grp, 'b3' str from dual) t group by grp select wm_concat(table_name) from user_tables; -- or 11.2g: -- 利用LISTAGG LISTAGG
文章评论
Cialis Without Prescription Canada Codttv - Cialis viagra disfuncion erectil psicologica best place to buy generic cialis online</a> Amoxicillin Dosage For Tooth Infections Hubixi Doryx 100mg C.O.D. Fdpugd - buy cialis professional Tczfdv cheap cialis 60mg