构建测试表: create table TABLE1 ( ID INTEGER, NAME VARCHAR2(10) ) create table TABLE2 ( ID INTEGER, ROLE VARCHAR2(10) ) insert into TABLE1 (ID, NAME) values (1, '张三'); insert into TABLE1 (ID, NAME) values (2, '李四'); commit; insert into TABLE2 (ID, ROLE) values (1, '查询'); insert into TABLE2 (ID, ROLE) values (1, '分析'); insert into TABLE2 (ID, ROLE) values (1, '决策'); insert into TABLE2 (ID, ROLE) values (2, '查询'); commit; 要求输出结果: ID NAME ROLE 1 张三 查询,分析,决策 2 李四 查询 方法一、使用wmsys.wm_concat SELECT TABLE1.*, WMSYS.WM_CONCAT(ROLE) FROM TABLE1, TABLE2 WHERE TABLE1.ID = TABLE2.ID GROUP BY TABLE1.ID, TABLE1.NAME 方法二、使用sys_connect_by_path SELECT ID, NAME, LTRIM(MAX(SYS_CONNECT_BY_PATH(ROLE, ',')), ',') FROM (SELECT ROW_NUMBER() OVER(PARTITION BY TABLE1.ID ORDER BY NAME) RN, TABLE1.*, ROLE FROM TABLE1, TABLE2 WHERE TABLE1.ID = TABLE2.ID) START WITH RN = 1 CONNECT BY PRIOR RN = RN - 1 AND PRIOR ID = ID GROUP BY ID, NAME ORDER BY ID 方法三、使用自定义函数 create or replace function my_concat(mid in integer) return varchar2 --记住:参数和返回值里的数据类型都不用定义长度 is result varchar2(4000); --定义变量,记住Oracle中定义变量不需要 begin for temp_cursor in (select role from table2 where id=mid) loop --此处在游标FOR循环中使用查询 result :=result || temp_cursor.role || ','; --Oracle中字符连接使用||,而sql server中用+ end loop; result := rtrim(result,','); --去掉最后一个空格,还有Oracle中的赋值前面没有set return result; end; select table1.*,my_concat(table1.id) from table1,table2 where table1.id=table2.id group by table1.id,table1.name order by table1.id