Oracle 数据合并的解决办法(用connect by 树解决)
2007-07-19 16:25
357 查看
首先来说说问题的需求: (是csdn论坛里的问题)
示例如下,表invoice_test:
order_num customer
263663 A
273631 A
163263 B
173636 B
553024 A
想得到这样的结果:
customer order_num
A 263663;273631;553024
B 163263;173636
SQL:
SELECT DISTINCT yy.customer,
ltrim(first_value(path)
over(PARTITION BY yy.customer ORDER BY yy.lev DESC),
';') order_num
FROM (SELECT tt.*,
LEVEL lev,
sys_connect_by_path(order_num, ';') path
FROM (SELECT it.customer ||
(row_number() over(PARTITION BY it.customer ORDER BY
it.customer)) a,
it.customer ||
(row_number() over(PARTITION BY it.customer ORDER BY
it.customer) - 1) b,
it.*
FROM invoice_test it
ORDER BY it.customer) tt
CONNECT BY PRIOR a = b) yy;
应该有点问题关于是否可用rownum?
答案是否。why?
因为把 row_number() over(PARTITION BY it.customer ORDER BY it.customer) 改为 rownum 的话,那么connect by 就无法通过父子结构去遍历数据。rownum它是伪列,它是按照当初创建表时数据插入的顺序生成的。
以下是用rownum产生的结果:
SQL> SELECT
2 it.customer||rownum c,
3 it.customer ||(rownum-1) p,
4 customer,
5 order_num
6 FROM
7 invoice_test it
8 order by customer
9 ;
C P CUSTOMER ORDER_NUM
------------------------------------------------------------ ------------------------------------------------------------ -------------------- ---------
A1 A0 A 263663
A2 A1 A 273631
A5 A4 A 553024
B3 B2 B 163263
B4 B3 B 173636
ths...
示例如下,表invoice_test:
order_num customer
263663 A
273631 A
163263 B
173636 B
553024 A
想得到这样的结果:
customer order_num
A 263663;273631;553024
B 163263;173636
SQL:
SELECT DISTINCT yy.customer,
ltrim(first_value(path)
over(PARTITION BY yy.customer ORDER BY yy.lev DESC),
';') order_num
FROM (SELECT tt.*,
LEVEL lev,
sys_connect_by_path(order_num, ';') path
FROM (SELECT it.customer ||
(row_number() over(PARTITION BY it.customer ORDER BY
it.customer)) a,
it.customer ||
(row_number() over(PARTITION BY it.customer ORDER BY
it.customer) - 1) b,
it.*
FROM invoice_test it
ORDER BY it.customer) tt
CONNECT BY PRIOR a = b) yy;
应该有点问题关于是否可用rownum?
答案是否。why?
因为把 row_number() over(PARTITION BY it.customer ORDER BY it.customer) 改为 rownum 的话,那么connect by 就无法通过父子结构去遍历数据。rownum它是伪列,它是按照当初创建表时数据插入的顺序生成的。
以下是用rownum产生的结果:
SQL> SELECT
2 it.customer||rownum c,
3 it.customer ||(rownum-1) p,
4 customer,
5 order_num
6 FROM
7 invoice_test it
8 order by customer
9 ;
C P CUSTOMER ORDER_NUM
------------------------------------------------------------ ------------------------------------------------------------ -------------------- ---------
A1 A0 A 263663
A2 A1 A 273631
A5 A4 A 553024
B3 B2 B 163263
B4 B3 B 173636
ths...
相关文章推荐
- oracle数据导出提示EAP-00091解决办法
- oracle 数据导入 数据和备注(comment)乱码问题解决办法
- 试图使用未在此报表服务器中注册的数据扩展插件“ORACLE”。 解决办法
- ArcMap发布地图服务报错:001270:合并数据失败的解决办法
- Oracle数据导入导出imp/exp sp2-0734:未知的命令开头'imp 忽略了剩余行默认分类 解决办法 sp2-0734:未知的命令开头'imp 忽略了剩余行默认分类 应该是在c
- oracle分页查询从结果集取数据不稳定解决办法
- ORACLE数据删除数据删除的解决办法
- oracle删除数据文件 解决办法
- Oracle修改数据时提示“record is locked by another user”的解决办法
- 升级oracle客户端后exp数据异常的解决办法
- [Oracle] “表中有数据,但select count(*)的结果为0”问题的解决办法
- 意外删除Oracle数据文件(dbf),恢复oralce库的解决办法--Oracle错误代码:ORA-01033
- PDO取Oracle lob大字段,当数据量太大无法取出的问题的解决办法
- oracle数据文件强制删除导致无法启动的解决办法
- oracle排序,出现页数不同数据却重复问题的原因及解决办法
- oracle 数据表被锁定解决办法
- PDO取Oracle lob大字段,当数据量太大无法取出的问题的解决办法
- 从Oracle JDBC中取百万条数据的解决办法
- 关于oracle重复数据合并以及.前面加0问题的解决
- PL/SQL查询Oracle数据乱码/Oracle客户端乱码解决办法