当我们需要处理订单的时候可能会有这样的奇怪的需求:把订单明细里的商品种类显示出来,例如一个订单包括图书,花生油,自行车,当我们存放的时候是分别存放到订单明细中的,当我们取得时候需要一起提取。这就涉及到一个合并列的概念。
一、订单表和订单详情表分开(总分结构):
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以后)