日期:2014-05-16 浏览次数:20535 次
数据库中有一张表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(+)
?