oracle10G数据库版本。我有一张表tb(id,pid,isOpen,title,isOpenFlag),字段类型全为varchar2。isOpen字段有2个值,一个是1:可供查;一个是2:不可查。pid可以重复。就是一个pid可有多个id。现在我要给isOpenFlag设值。具体是要求是这样设置的:默认值为1,1,然后如果pid有一个或者多个id,而且isOpen全是1可供查的话,就将所有pid下面的id的isOpenFlag记录设置为0(可供查可标记)。2,然后如果pid有一个或者多个id,但是其中isOpen的值,有1可供查也有2不可查的话,就将pid下面的id的isOpen字段值为1的记录设置0(可供查可标记);将pid下面的id的isOpen值为2的记录的isOpenFlag字段值设置为2(不可查不可标记)。3,然后如果pid有一个或者多个id,而且isOpen全是2可供查的话,就将所有pid下面的id记录中的其中一个的isOpenFlag记录设置为1(不可供查可标记),而将剩下的记录的isOpenFlag字段值设置为2(不可查不可标记)。我原来想用where中的子查询中用 select from tb where exists (select count(1) from tb t where t.isOpen='1' and t.id=tb.id)来一个个条件实现,不过发现这样效率太低而且要写很多条件判断。麻烦!由于数据表的数据量比较大,有700多万,所以这样的操作的,只有用批量操作才可行。问下,大家有什么好的sql没有,如何写才能最简捷高效!

解决方案 »

  1.   

    update tb a set isopenflag=(
    select case when isopen=1 then 0 
           when isopen=2 and lag(isopen)over(partition by pid order by id) is null then 1 else 2 end
    from tb where id=a.id)
      

  2.   

    select t.id from testTable t group by t.id having count(id)<=1
    试着改吧
      

  3.   

    3,然后如果pid有一个或者多个id,而且isOpen全是2可供查的话,就将所有pid下面的id记录中的其中一个的isOpenFlag记录设置为1(不可供查可标记),而将剩下的记录的isOpenFlag字段值设置为2(不可查不可标记)。 觉得楼主描述的3步骤不太清楚,如果pid仅一个时,是不是就只将其isOpenFlag的记录置为1