我有一个表的模型如下, desc time
------- -----
... ...
B 1
E 2
B 3
E 4
B 5
E 6
B 7
B 8
E 9
B A
B B
E C
B D
E F
... ...正常的应是(B)egin, 后一行即为(E)nd, 现要找出不正常的情况(Begin后没End):
B 7
B Awho to do?
------- -----
... ...
B 1
E 2
B 3
E 4
B 5
E 6
B 7
B 8
E 9
B A
B B
E C
B D
E F
... ...正常的应是(B)egin, 后一行即为(E)nd, 现要找出不正常的情况(Begin后没End):
B 7
B Awho to do?
where desc='B' and not exist
(select * from table
where desc='E' and tonumber(time)=tonumber(A.time)+1);
其中tonumber函数具体名称和用法可能不确切,但算法应该对的。
JOB.WHAT:
insert into 上表 values('begin', sysdate);
execute procedure;
insert into 上表 values('end', sysdate);所以,b后面必须是e!!如果不是,该job的执行被kill了,然后又submit.
实际上是9i, 作为讨论,把8i也算上!
谢谢
如果数据量可以接受的话,建好索引,自己写个存储过程实现就行
1按照程序,应该不存在只有End而没有Begin的记录。
2先查出所有Begin的记录,可以存到游标中,对于每条记录,查询比该记录时间大且时间最近的记录是否为End,如果不是说明该记录是要找的。
insert into skyxj_test values('B', 1);
insert into skyxj_test values('E', 2);
insert into skyxj_test values('B', 3);
insert into skyxj_test values('B', 5);
insert into skyxj_test values('E', 6);
insert into skyxj_test values('B', 7);
insert into skyxj_test values('B', 9);
insert into skyxj_test values('E', 10);
commit;
按问题要求,应该是('B', 3)和('B', 7)为要找的记录,语句:
select * from skyxj_test t1 where a = 'B' and (select t2.a from skyxj_test t2 where t2.b > t1.b and rownum < 2) in ('B');
输出结果为:
SQL> A B
-- ------
B 3
B 7
满足要求。
第二种方法可能有问题, (我没有做测试),因为你的子查询无法定位到(紧跟)主查询的下一行!!用cursor也是我的第一个想法(可以解决问题),但,是个蠢想法!期待更好的方法... ...
skyxj(java学习中…▲天行健) 该子查询返回(最多) 一行,这是肯定的; 但该行不(一定)是“紧跟”主查询的那一行,因为rownum是逻辑上的, 用rowID或许可能....你用以下的试一试,就明白了:
insert into skyxj_test values('B', 11);
insert into skyxj_test values('E', 14);
insert into skyxj_test values('E', 12);
insert into skyxj_test values('B', 13);
insert into skyxj_test values('B', 19);
insert into skyxj_test values('B', 15);
insert into skyxj_test values('B', 16);
insert into skyxj_test values('B', 17);
insert into skyxj_test values('E', 18);
insert into skyxj_test values('E', 20);
insert into skyxj_test values('B', 1);
insert into skyxj_test values('E', 2);
insert into skyxj_test values('B', 3);
insert into skyxj_test values('B', 5);
insert into skyxj_test values('E', 6);
insert into skyxj_test values('B', 7);
insert into skyxj_test values('B', 9);
insert into skyxj_test values('E', 10);
commit;-------
thanks anyway!!
各位神仙:小神這邊有禮拉
我剛剛從informix的一個table裡面倒出的資料
unload to maf_file.txt delimiter ' '
select * from maf_file
然後我想把他導入oracle相對應的表裡面,該怎麼做阿~~~
請幫忙阿,我都快哭拉..
怎么占有我的地盘,你的问题用ORACLE的工具SQLLDR, 或写程序解析, 或用PB的管道,或用sqlServer的DTC;
一边凉快去,别来烦我!
not exists(select * from table b where b.desc='E' and b.rownum=a.rownum+1)
如果要求E前必须是B
union all
select * from table a where a.desc='E' and
not exists(select * from table b where b.desc='B' and b.rownum=a.rownum-1)
insert into 上表 values('begin', sysdate);
execute procedure;
insert into 上表 values('end', sysdate);如果你的JOB.WHAT是并行处理,那自然是可能导致B\E顺序是混乱的,实际上,如果你依然定位在数据库下一行,这可能不是由于意外中断而产生的有B无E,因为可能的情况是BBEE,但不是意外中断错误。如果能保证串行处理,那么sysdata总是后推的,我的方法就可行。但是如果出现你的情况,你的需求就达不到。
get seq into ...
insert into 上表 values(...,'begin', sysdate);
execute procedure;
insert into 上表 values(...,'end', sysdate);
这样一来就能判断了啊.
(select desc,time from tbname) t1,
(select desc,time-1 from tbname) t2
where t1=t2(+) and t1.desc=t2.desc and t1.desc='B';