数据库中有一张表Test,其表结构如下所示:
job_id | dep_id | item | name | no |
000101 | 0900 | 002 | A001 | |
000101 | 0900 | 003 | A002 | |
000101 | 0901 | 001 | B003 | |
000202 | 0900 | 004 | A005 | |
000202 | 0902 | 003 | C004 | |
000303 | 0901 | 002 | B004 | |
000303 | 0901 | 004 | B005 |
规则:其实意思就是让一组中item为002的记录所对应的name优先做no的前缀
1、先以job_id,dep_id分组记录;
2、检查同一组记录中有沒有item为002的记录,如果存在,這一组记录的no都是以item为002这条记录对应的name+当前日期,这一组记录的no都相同;如果一组中不存在item为002的记录那么可以隨便挑一个同组中name字段的值做no的前缀。
其结果如下所示:
job_id | dep_id | item | name | no |
000101 | 0900 | 002 | A001 | A001 -2008-12-25 09:12:06 |
000101 | 0900 | 003 | A002 | A001 -2008-12-25 09:12:06 |
000101 | 0901 | 001 | B003 | B003-2008-12-25 09:12:06 |
000202 | 0900 | 004 | A005 | A005-2008-12-25 09:12:06 |
000202 | 0902 | 003 | C004 | C004-2008-12-25 09:12:06 |
000303 | 0901 | 002 | B004 | B004 -2008-12-25 09:12:06 |
000303 | 0901 | 004 | B005 | B004 -2008-12-25 09:12:06 |
其Sql语句为:
select tt.job_id,tt.dep_id,tt.item,tt.name,
nvl2(t2.no,t2.no,concat(tt.name || '-', to_char(sysdate,'yyyy-mm-dd HH24:mm:ss'))) no
from test tt,
(select t1.job_id,t1.dep_id,t1.item,t1.name,
concat(t1.name || '-',to_char(sysdate, 'yyyy-mm-dd HH24:mm:ss')) no
from test t1,
(select job_id sj, dep_id sd
from test t
group by job_id, dep_id
having count(*) > 1) s
where t1.job_id = s.sj
and t1.dep_id = s.sd
and t1.item = '002') t2
where tt.job_id = t2.job_id(+)
and tt.dep_id = t2.dep_id(+)