SQL 语句本身好像没有合并记录的功能,只能合并列。 一个解决方法是利用函数,如下:-- 数据准备 CREATE TABLE mt( c1 NUMBER PRIMARY KEY, c2 VARCHAR2(30), c3 VARCHAR2(30));CREATE TABLE ct( e0 NUMBER PRIMARY KEY, e1 NUMBER REFERENCES mt(c1), e2 VARCHAR2(30));INSERT INTO mt VALUES(1,'X','Y'); INSERT INTO mt VALUES(2,'X','Z'); INSERT INTO ct VALUES(8,1,'你'); INSERT INTO ct VALUES(9,1,'好'); INSERT INTO ct VALUES(10,2,'吃'); INSERT INTO ct VALUES(11,2,'了'); INSERT INTO ct VALUES(12,2,'吗');-- 创建函数 CREATE OR REPLACE FUNCTION concat_rows(p_parent_id NUMBER) RETURN VARCHAR2 IS v_result VARCHAR2(120); BEGIN FOR rec IN (SELECT e2 FROM ct WHERE e1 = p_parent_id ORDER BY e0) LOOP v_result := v_result || rec.e2; END LOOP; return v_result; END;-- SQL 语句 SELECT c1,c2,c3,concat_rows(c1) FROM mt;-- 输出 C1 C2 C3 CONCAT_ROWS(C1) ---------- ------------------------------ ------------------------------ -------------------------------------------------------------------------------- 1 X Y 你好 2 X Z 吃了吗
select t1.c1, replace(substr(MAX(sys_connect_by_path(t1.e2, ',')),2),',','') e2 from ( select a.*,b.*,row_number()over(partition by a.c1 order by b.e0) rn from 主表 a,子表 b where a.c1=b.e1 ) t1 start with t1.c1=1 connect by t1.c1 = prior t1.c1 and t1.rn -1 = prior t1.rn group by t1.c1;
我把三楼的SQL语句改了一下,现在结果正确了。主要问题是:一 start with不对;二 字符串处理有点问题。select t1.c1, replace(MAX(substr(sys_connect_by_path(t1.e2, ','), 2)), ',', '') e2 from (select a.*, b.*, row_number() over(partition by a.c1 order by b.e0) rn from mt a, ct b where a.c1 = b.e1) t1 start with t1.rn = 1 connect by t1.c1 = prior t1.c1 and t1.rn - 1 = prior t1.rn group by t1.c1;总结一下:这种方式实际上也是使用函数,只不过是系统函数。优点是不用自己开发函数,不需要懂PL/SQL。缺点是语句比较复杂难懂。但是,非常佩服,三楼的SQL知识非常丰富,跟你学了不少知识。这里谢了。
一个解决方法是利用函数,如下:-- 数据准备
CREATE TABLE mt(
c1 NUMBER PRIMARY KEY,
c2 VARCHAR2(30),
c3 VARCHAR2(30));CREATE TABLE ct(
e0 NUMBER PRIMARY KEY,
e1 NUMBER REFERENCES mt(c1),
e2 VARCHAR2(30));INSERT INTO mt VALUES(1,'X','Y');
INSERT INTO mt VALUES(2,'X','Z');
INSERT INTO ct VALUES(8,1,'你');
INSERT INTO ct VALUES(9,1,'好');
INSERT INTO ct VALUES(10,2,'吃');
INSERT INTO ct VALUES(11,2,'了');
INSERT INTO ct VALUES(12,2,'吗');-- 创建函数
CREATE OR REPLACE FUNCTION concat_rows(p_parent_id NUMBER) RETURN VARCHAR2 IS
v_result VARCHAR2(120);
BEGIN
FOR rec IN (SELECT e2 FROM ct WHERE e1 = p_parent_id ORDER BY e0) LOOP
v_result := v_result || rec.e2;
END LOOP;
return v_result;
END;-- SQL 语句
SELECT c1,c2,c3,concat_rows(c1) FROM mt;-- 输出
C1 C2 C3 CONCAT_ROWS(C1)
---------- ------------------------------ ------------------------------ --------------------------------------------------------------------------------
1 X Y 你好
2 X Z 吃了吗
from
(
select a.*,b.*,row_number()over(partition by a.c1 order by b.e0) rn
from 主表 a,子表 b
where a.c1=b.e1
) t1
start with t1.c1=1
connect by t1.c1 = prior t1.c1
and t1.rn -1 = prior t1.rn
group by t1.c1;
replace(MAX(substr(sys_connect_by_path(t1.e2, ','), 2)), ',', '') e2
from (select a.*,
b.*,
row_number() over(partition by a.c1 order by b.e0) rn
from mt a, ct b
where a.c1 = b.e1) t1
start with t1.rn = 1
connect by t1.c1 = prior t1.c1
and t1.rn - 1 = prior t1.rn
group by t1.c1;总结一下:这种方式实际上也是使用函数,只不过是系统函数。优点是不用自己开发函数,不需要懂PL/SQL。缺点是语句比较复杂难懂。但是,非常佩服,三楼的SQL知识非常丰富,跟你学了不少知识。这里谢了。