我有一个表的模型如下, 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?

解决方案 »

  1.   

    select * from table A
    where desc='B' and not exist
    (select * from table
     where desc='E' and tonumber(time)=tonumber(A.time)+1);
    其中tonumber函数具体名称和用法可能不确切,但算法应该对的。
      

  2.   

    这是一个job中执行时产生的,
    JOB.WHAT:
       insert into 上表 values('begin', sysdate);
        execute procedure;
       insert into 上表 values('end', sysdate);所以,b后面必须是e!!如果不是,该job的执行被kill了,然后又submit.
    实际上是9i, 作为讨论,把8i也算上!
    谢谢
      

  3.   

    相应的函数不清楚
    如果数据量可以接受的话,建好索引,自己写个存储过程实现就行
    1按照程序,应该不存在只有End而没有Begin的记录。
    2先查出所有Begin的记录,可以存到游标中,对于每条记录,查询比该记录时间大且时间最近的记录是否为End,如果不是说明该记录是要找的。
      

  4.   

    create table skyxj_test(a varchar2(2), b number(5));
    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
    满足要求。
      

  5.   

    Fist, 谢谢各位!
    第二种方法可能有问题, (我没有做测试),因为你的子查询无法定位到(紧跟)主查询的下一行!!用cursor也是我的第一个想法(可以解决问题),但,是个蠢想法!期待更好的方法... ...
      

  6.   

    条件t2.b > t1.b and rownum < 2使子查询已经定位到(紧跟)主查询的下一行!!
      

  7.   

    Hi,
    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!!
      

  8.   

    不知道怎麼發,好,我就發到你下面,樓主借你寶地一用..
    各位神仙:小神這邊有禮拉
     我剛剛從informix的一個table裡面倒出的資料
     unload to maf_file.txt delimiter '    '
     select * from maf_file
     然後我想把他導入oracle相對應的表裡面,該怎麼做阿~~~
     請幫忙阿,我都快哭拉..
      

  9.   

    hi,
    怎么占有我的地盘,你的问题用ORACLE的工具SQLLDR,  或写程序解析, 或用PB的管道,或用sqlServer的DTC;
    一边凉快去,别来烦我!
      

  10.   

    select * from table a where a.desc='B' and
         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)
      

  11.   

    JOB.WHAT:
       insert into 上表 values('begin', sysdate);
        execute procedure;
       insert into 上表 values('end', sysdate);如果你的JOB.WHAT是并行处理,那自然是可能导致B\E顺序是混乱的,实际上,如果你依然定位在数据库下一行,这可能不是由于意外中断而产生的有B无E,因为可能的情况是BBEE,但不是意外中断错误。如果能保证串行处理,那么sysdata总是后推的,我的方法就可行。但是如果出现你的情况,你的需求就达不到。
      

  12.   

    加一个序列号:
    get seq into ...
      insert into 上表 values(...,'begin', sysdate);
        execute procedure;
       insert into 上表 values(...,'end', sysdate);
    这样一来就能判断了啊.
      

  13.   

    select t1.*
    (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';