Oracle合并行的使用介绍

        当我们需要处理订单的时候可能会有这样的奇怪的需求:把订单明细里的商品种类显示出来,例如一个订单包括图书,花生油,自行车,当我们存放的时候是分别存放到订单明细中的,当我们取得时候需要一起提取。这就涉及到一个合并列的概念。

一、订单表和订单详情表分开(总分结构):

Oracle 10g提供的方法是:

select t.order_id                                       as                         order_id,

wmsys.wm_concat(t.goods_name)    as                    goods_name

from tab_order_detail_info t

group by t.order_id;

wmsys.wm_concat(name) 方法是非常灵活的,默认采用’,’进行分割,一般都是

结合group by进行使用。

得到的结果就是: 436 图书,花生油,自行车。

二、订单表和订单详情表没分开(总总结构):

         sys_connect_by_path(字段名, 2个字段之间的连接符号),注意这里的连接符号不要使用逗号,oracle会报错,如果一定要用,可以使用replace替换一下,方法如下 repalce(字段名,原字符,',')

: startwith 条件1connect by prior 条件2

条件1 =XX (或父=XX)

条件2 : -->(倒树) 则为 connectby = prior 根; :--> (正树) connect = prior 子。

        根节点并不一定是在数据库中设计的顶级节点,而是start with开始的地方。函数就是从start with开始的地方开始遍历,并记下其遍历到的节点,start with开始的地方被视为根节点,将遍历到的路径根据函数中的分隔符,组成一个新的字符串。sys_connect_by_path函数用connect by来寻找下一条记录,直到迭代找不到相应记录为止。概念与递归类似,connect by指定递归(连接)条件,如果条件不满足则递归结束。

三、select listagg(t.order_id,',') within group (order by t.order_id)col_name from tab_order_info;11g以后)

你可能感兴趣的:(oracle,sql,原理,合并行)