有如下两张表
表A:
id taskid area_code keyword advertiser_id order_month
1 1 0 咖啡 1 201108
2 2 1 音乐 2 201108
3 3 0 生活 3 201109
表B:
id keyword synonyms
1 咖啡 咖啡厅
2 咖啡 咖啡屋
3 咖啡 咖啡店
4 音乐 流行音乐
5 音乐 古典音乐
6 生活 恬静的生活
7 生活 安逸的生活
两张表对应的字段是keyword
现在想要如下结果:
area_code keyword order_month synonyms
0 咖啡 201108 咖啡厅,咖啡屋,咖啡店
0 生活 201109 恬静的生活,安逸的生活
1 音乐 201108 流行音乐,古典音乐
表A:
id taskid area_code keyword advertiser_id order_month
1 1 0 咖啡 1 201108
2 2 1 音乐 2 201108
3 3 0 生活 3 201109
表B:
id keyword synonyms
1 咖啡 咖啡厅
2 咖啡 咖啡屋
3 咖啡 咖啡店
4 音乐 流行音乐
5 音乐 古典音乐
6 生活 恬静的生活
7 生活 安逸的生活
两张表对应的字段是keyword
现在想要如下结果:
area_code keyword order_month synonyms
0 咖啡 201108 咖啡厅,咖啡屋,咖啡店
0 生活 201109 恬静的生活,安逸的生活
1 音乐 201108 流行音乐,古典音乐
SQL> WITH t1 AS (
2 SELECT '1' tid,'1' taskid,'0' area_code,'咖啡' keyword,'1' advertiser_id,'201108' order_month FROM dual UNION ALL
3 SELECT '2' tid,'2' taskid,'1' area_code,'音乐' keyword,'2' advertiser_id,'201108' order_month FROM dual UNION ALL
4 SELECT '3' tid,'3' taskid,'0' area_code,'生活' keyword,'3' advertiser_id,'201109' order_month FROM dual
5 )
6 ,t2 AS (
7 SELECT 1 tid,'咖啡' keyword,'咖啡厅' synonyms FROM dual UNION ALL
8 SELECT 2 tid,'咖啡' keyword,'咖啡屋' synonyms FROM dual UNION ALL
9 SELECT 3 tid,'咖啡' keyword,'咖啡店' synonyms FROM dual UNION ALL
10 SELECT 4 tid,'音乐' keyword,'流行音乐' synonyms FROM dual UNION ALL
11 SELECT 5 tid,'音乐' keyword,'古典音乐' synonyms FROM dual UNION ALL
12 SELECT 6 tid,'生活' keyword,'恬静的生活' synonyms FROM dual UNION ALL
13 SELECT 7 tid,'生活' keyword,'安逸的生活' synonyms FROM dual
14 )
15 SELECT t1.area_code,
16 t1.keyword,
17 t1.order_month,
18 n.synonyms
19 FROM t1
20 LEFT JOIN (SELECT m.keyword,
21 substr(sys_connect_by_path(synonyms, ','), 2) synonyms
22 FROM (SELECT t2.*,
23 row_number() over(PARTITION BY t2.keyword ORDER BY t2.tid) rn
24 FROM t2) m
25 WHERE connect_by_isleaf = 1
26 START WITH m.rn = 1
27 CONNECT BY PRIOR rn = rn - 1
28 AND PRIOR keyword = keyword) n ON t1.keyword =
29 n.keyword
30 ;AREA_CODE KEYWORD ORDER_MONTH SYNONYMS
--------- ------- ----------- --------------------------------------------------------------------------------
0 咖啡 201108 咖啡厅,咖啡屋,咖啡店
0 生活 201109 恬静的生活,安逸的生活
1 音乐 201108 流行音乐,古典音乐
CURSOR C1(V_KEYWORD VARCHAR2) IS
SELECT SYNONYMS FROM TB_B WHERE KEYWORD = V_KEYWORD;
BEGIN
FOR STR_TEMP IN C1(IN_KEYWORD) LOOP
STR_RETURN := STR_RETURN || STR_TEMP.SYNONYMS || CHR(44);
END LOOP;
STR_RETURN := RTRIM(STR_RETURN, CHR(44));
RETURN STR_RETURN;
END F_GROUP;SELECT area_code, keyword, order_month,f_group(a.keyword) FROM tb_a a
SELECT '1' tid,'1' taskid,'0' area_code,'咖啡' keyword,'1' advertiser_id,'201108' order_month FROM dual UNION ALL
SELECT '2' tid,'2' taskid,'1' area_code,'音乐' keyword,'2' advertiser_id,'201108' order_month FROM dual UNION ALL
SELECT '3' tid,'3' taskid,'0' area_code,'生活' keyword,'3' advertiser_id,'201109' order_month FROM dual
)
,t2 AS (
SELECT 1 tid,'咖啡' keyword,'咖啡厅' synonyms FROM dual UNION ALL
SELECT 2 tid,'咖啡' keyword,'咖啡屋' synonyms FROM dual UNION ALL
SELECT 3 tid,'咖啡' keyword,'咖啡店' synonyms FROM dual UNION ALL
SELECT 4 tid,'音乐' keyword,'流行音乐' synonyms FROM dual UNION ALL
SELECT 5 tid,'音乐' keyword,'古典音乐' synonyms FROM dual UNION ALL
SELECT 6 tid,'生活' keyword,'恬静的生活' synonyms FROM dual UNION ALL
SELECT 7 tid,'生活' keyword,'安逸的生活' synonyms FROM dual
)
select t1.area_code,t1.keyword,t1.order_month,
max(substr(sys_connect_by_path(synonyms,','),2))
from t1,t2 where t1.keyword=t2.keyword
start with 1=1
connect by t2.tid =PRIOR t2.tid+1
and t1.tid=PRIOR t1.tid
group by t1.area_code,t1.keyword,t1.order_month--result:0 咖啡 201108 咖啡屋,咖啡店
0 生活 201109 恬静的生活,安逸的生活
1 音乐 201108 流行音乐,古典音乐
row_number还是要加的,如果tid不是连续的,你的结果就不正确了。
注:下面的代码中引用了1楼的测试数据WITH t1 AS (
SELECT '1' tid,'1' taskid,'0' area_code,'咖啡' keyword,'1' advertiser_id,'201108' order_month FROM dual UNION ALL
SELECT '2' tid,'2' taskid,'1' area_code,'音乐' keyword,'2' advertiser_id,'201108' order_month FROM dual UNION ALL
SELECT '3' tid,'3' taskid,'0' area_code,'生活' keyword,'3' advertiser_id,'201109' order_month FROM dual
)
,t2 AS (
SELECT 1 tid,'咖啡' keyword,'咖啡厅' synonyms FROM dual UNION ALL
SELECT 2 tid,'咖啡' keyword,'咖啡屋' synonyms FROM dual UNION ALL
SELECT 3 tid,'咖啡' keyword,'咖啡店' synonyms FROM dual UNION ALL
SELECT 4 tid,'音乐' keyword,'流行音乐' synonyms FROM dual UNION ALL
SELECT 5 tid,'音乐' keyword,'古典音乐' synonyms FROM dual UNION ALL
SELECT 6 tid,'生活' keyword,'恬静的生活' synonyms FROM dual UNION ALL
SELECT 7 tid,'生活' keyword,'安逸的生活' synonyms FROM dual
)
SELECT area_code,t1.keyword,order_month,wm_concat(synonyms)
from t1,t2
where t1.keyword = t2.keyword
group by area_code,t1.keyword,order_month;
create or replace type strcat_type as object (
cat_string varchar2(4000),
--对象初始化
static function ODCIAggregateInitialize(cs_ctx In Out strcat_type)
return number,
--聚合函数的迭代方法(这是最重要的方法)
member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2)
return number,
--当查询语句并行运行时,才会使用该方法,可将多个并行运行的查询结果聚合
member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type)
return number,
--终止聚集函数的处理,返回聚集函数处理的结果
member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out varchar2,flags in number)
return number
) 2.建立type body strcat_type
create or replace type body strcat_type is
static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number
is
begin
cs_ctx := strcat_type( null );
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT strcat_type,
value IN varchar2 )
return number
is
begin
/*字符串已','分割 */
self.cat_string := self.cat_string || ','|| value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN Out strcat_type,
returnValue OUT varchar2,
flags IN number)
return number
is
begin
/*去除空(is null)*/
returnValue := ltrim(rtrim(self.cat_string,','),',');
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT strcat_type,
ctx2 IN Out strcat_type)
return number
is
begin
self.cat_string := self.cat_string || ',' || ctx2.cat_string;
return ODCIConst.Success;
end;
end;3.建立函数func_strcatCREATE OR REPLACE FUNCTION func_strcat(input varchar2)
RETURN varchar2 -- 返回值
PARALLEL_ENABLE AGGREGATE USING strcat_type; --使平行累加4.结果
select * from t_test t;id keyword synonyms
1 咖啡 咖啡厅
2 咖啡 咖啡屋
3 咖啡 咖啡店
4 音乐 流行音乐
5 音乐 古典音乐
6 生活 恬静的生活
7 生活 安逸的生活
_________________________________________
select t.keyword,func_strcat(t.synonyms)
from t_test t group by t.keyword;keyword func_strcat(t.synonyms)
咖啡 咖啡厅,咖啡屋,咖啡店
生活 恬静的生活,安逸的生活
音乐 流行音乐,古典音乐
__________________________________________
最后一步,将上面聚合结果和第一个a表联合即可