本帖最后由 rainxies 于 2013-09-27 11:27:00 编辑

解决方案 »

  1.   

    新建一张卡号表Badge(badgeid number, free varchar2(1));
    新建一个job,每天扫描一次员工表,对于已离职的员工,更新badge对应的badgeid free状态为Y.
      

  2.   


    嗯,这个应该可以,新建table好像太麻烦了
      

  3.   

    既然一个sql难搞,那就用存储过程吧。
    触发器还是能不用就不用吧。
      

  4.   

    触发器会带来很大副作用,不建议使用。如果考虑到并发可能造成的脏数据,可以给表加一个唯一约束。你可以这样:新增一个列 是否离职(number  1:离职 0:未离职), 然后: CASE  WHEN 是否离职 IS NULL or 是否离职=0 THEN 卡号 END。 职工在离职的时候除了更新时间外,还要更新 ”是否离职“。
      

  5.   

    上表的离职日期可能是一个未来的值,到那天就自动离职了。除非每天开个job,把离职日期小于等于今天的,其“是否离职”改为1
      

  6.   

    触发器看来也不行,一般情况下,它不能查询本表其他line的数据,这样,就不知道这个卡号是不是可以用
      

  7.   

    类似于下面的做法应该是可以的吧,看执行结果的笔数就知道是否有Insert成功了。
    -- ID=工号ID3,Card=卡号C1,trndate=离职时间
    insert into t1 (id,card,trndate)
     select 'ID3','C1',null from dual where not exists(select 1 from t1 where card='C1' and (trndate is null or trndate>sysdate))
     ;
      

  8.   

    这个看起来倒是没什么问题了,好像一切问题都解决了。
    不过我很好奇,如果2个人同时执行这个SQL,能不能写入2行进table?
      

  9.   

    merge into ..
    加上你的是否离职是否唯一判断条件,有什么问题
      

  10.   


    merge into,用上面这个其实也一样
    insert into t1 (id,card,trndate)
     select 'ID3','C1',null from dual where not exists(select 1 from t1 where card='C1' and (trndate is null or trndate>sysdate))
     ;
    只是这个能保证不重复吗?
      

  11.   


    merge into,用上面这个其实也一样
    insert into t1 (id,card,trndate)
     select 'ID3','C1',null from dual where not exists(select 1 from t1 where card='C1' and (trndate is null or trndate>sysdate))
     ;
    只是这个能保证不重复吗?只要你的id字段是加上了unique约束,oracle就为你保证了不会重复,无论你横插还是竖插