当我们在做一些比较复杂的数据导出时,可能会经常遇到要将不固定的多行数据组合成一个字符串返回;ISVP中就遇到了类似的情况,要求对于每一个APP,返回他所属的所有类目名称,类目名称之间用,隔开;对于该类型的问题,总结一下大致有如下几种常见方案;在具体陈述实现方案之前,我们先介绍下我们即将操作的表结构:
SQL> desc app_category_link;
Name Type Nullable Default Comments
-------------------- ------------ -------- ------- -------------
APP_CATEGORY_LINK_ID VARCHAR2(20) 主关键
APP_ID VARCHAR2(20) 应用ID
APP_CATEGORY_ID VARCHAR2(20) 应用类别ID
其中字段APP_ID和APP_CATEGORY_ID是一对多关系;
方案1:sys_connect_by_path + start with ... connect by ... prior + 分析函数
从上面的这个公式中我们可以看出,该方案主要是通过分析函数和父子级联查询来完成,一般是一条SQL搞定,比较省事;首先来看几个具体实现SQL;
具体实现1:
SELECT app_id,
ltrim(max(sys_connect_by_path(app_category_id, ',')), ',') categ_ids
FROM (SELECT app_id,
app_category_id,
app_category_id || '|' || rn rchild,
app_category_id || '|' || (rn - 1) rfather
FROM (SELECT app_id,
app_category_id,
row_number() over(PARTITION BY app_id ORDER BY app_category_id) rn
FROM app_category_link))
START WITH rfather LIKE '%|0'
CONNECT BY PRIOR rchild = rfather
GROUP BY app_id;
具体实现2:
select app_id,
本内容试读结束,登录后可阅读更多
下载后可阅读完整内容,剩余3页未读,立即下载