有一个表CVSUSROBJRELTAB,主键为GAGEOBJID,USRNM,一个GAGEOBJID可能有多个USRNM,现在我要做的是,将记录按GAGEOBJID分组后,将每组的第一条记录的一个字段CHRGFLG改为1,我不知道怎么表达第一条这个概念,谁能帮我写一下呢?呵呵!谢谢了哈

解决方案 »

  1.   

    update CBSUSROBJRELTAB t SET CHRGFLG=1
    where exists
    (
    select * from
    (
    select *,row_number() over (partition by GAGEOBJID) rn from CBSUSROBJRELTAB
    )where rn=1 and GAGEOBJID=T.GAGEOBJID AND USRNM=t.USRNM
    )
      

  2.   

    UPDATE CVSUSROBJRELTAB A
    SET    CHRGFLG = 1
    WHERE EXISTS (SELECT 1 FROM (
                     SELECT ROW_NUMBER() OVER (PARTITION BY GAGEOBJID ORDER BY GAGEOBJID) AS SEQ,
                            ROWID AS RID
                     FROM   CVSUSROBJRELTAB) B WHERE B.SEQ = 1 AND B.RID = A.ROWID)
      

  3.   

    哦,我的描述有点不对了,是这样的应该:有一个表CVSUSROBJRELTAB,主键为GAGEOBJID,USRNM,一个GAGEOBJID可能有多个USRNM,现在我要做的是,将记录按GAGEOBJID分组后,判断每组记录中是否有CHRGFLG=1的记录,有则不处理,没有,则将此组的第一条记录的CHRGFLG改为1,我是菜鸟,大家多点耐心哈,谢谢啦!
      

  4.   


    update table t
    set CHRGFLG=1
    where exists(select 'Z' from (select GAGEOBJID,USRNM,CHRGFLG,count(decode(CHRGFLG,1,1,null)) from table
    group by GAGEOBJID,USRNM,CHRGFLG having count(*)=0) a,
    (select b.*,row_number() over(PARTITION BY GAGEOBJID ORDER BY GAGEOBJID) as rn from table b) c 
    where a.GAGEOBJID=t.GAGEOBJID and a.USRNM=t.USRNM and c.rn=1)
    应该没问题了
      

  5.   

    楼主你试下就知道了!你怕update错了,先select出来看下前面的2个sql没有去除(CHRGFLG=1的记录,有则不处理)这个条件是你后加的
    我的做关联把这些去掉了
    sql是让我写复杂了,看楼下的了!
      

  6.   

    大尾巴狼兄,你写的sql貌似没有实现我的功能哦,我今天把你写的sql用到程序中,测试的守候发现没有实现我所要求的功能,帮我再想想哈!不知还有哪位大虾能写出自己的sql呢?小弟多谢了!
      

  7.   

    update CVSUSROBJRELTAB set CHRGFLG=1 where (GAGEOBJID,USRNM ) in (
    SELECT GAGEOBJID,min(USRNM) from CVSUSROBJRELTAB where GAGEOBJID in (
    SELECT GAGEOBJID from CVSUSROBJRELTAB group by GAGEOBJID having sum(decode (CHRGFLG,1,1,0))=0) 
    group by GAGEOBJID)
      

  8.   

    UPDATE CVSUSROBJRELTAB A
       SET CHRGFLG = (SELECT '1'
                        FROM (SELECT GAGEOBJID, MIN(USRNM) AS USRNM
                                FROM CVSUSROBJRELTAB
                               GROUP BY GAGEOBJID) B
                       WHERE A.GAGEOBJID = B.GAGEOBJID
                         AND A.USRNM = B.USRNM)
      

  9.   

    问题解决了吗?
    以下测试过了
    create table test( 
    GAGEOBJID varchar(20),
    USRNM varchar(20),
    CHRGFLG  varchar(20));insert into test 
    select 'a','aa','1' from dual union
    select 'a','aa','2' from dual union
    select 'a','bb','12' from dual union
    select 'a','cc','13' from dual union
    select 'b','aa','2' from dual union
    select 'b','bb','12' from dual union
    select 'c','vv','4' from dual union
    select 'd','vv','4' from dualupdate test t
    set CHRGFLG=1
    where (GAGEOBJID,USRNM) in (
                                select GAGEOBJID,min(USRNM) from test            
                                group by GAGEOBJID 
                                having count(decode(CHRGFLG,'1',1,null))=0
                                )