Oracle更新许多相同行中的一行

时间:2013-10-09 10:00:02

标签: sql oracle

在我的数据库中,我有相同的行。我只需要更新一行。

我这样做,但它不起作用。

update stat.stat_dial
set 
time = 200
where rownum = (select *  from  stat.stat_dial
where sesion= '0/1/0/3886.2241_D90EC01900C01899'
and rownum =1
order by time desc)

5 个答案:

答案 0 :(得分:4)

每一行都应该有一个唯一的主键,这是第一个普通形式。

如果你没有,那你就有更大的问题。您应该尽快更改该数据库。

答案 1 :(得分:4)

我目前无法验证这一点,但可能会有效:

update stat.stat_dial
set time = 200
where rowid = 
    (select rowid from 
        (select rowid  from  stat.stat_dial 
                      where sesion= '0/1/0/3886.2241_D90EC01900C01899'
                         order by time desc)
        where rownum = 1 )

答案 2 :(得分:1)

您可以更新具有符合条件的最小rowid的行。

update stat.stat_dial
set    time = 200
where  rowid = (
         select min(rowid)
         from   stat.stat_dial 
         where  sesion= '0/1/0/3886.2241_D90EC01900C01899')

update stat.stat_dial
set    time = 200
where  rowid = (
         select rowid
         from   stat.stat_dial 
         where  sesion= '0/1/0/3886.2241_D90EC01900C01899' and
                rownum = 1)

我认为我更喜欢后者的反射,因为前者总是在子查询中返回一行,即使条件不满足,但是结果为NULL。

答案 3 :(得分:0)

你的查询是真的只是一个小问题,试试这个:

 update stat.stat_dial
 set 
 time = 200
 where rownum = (select rownum  from  stat.stat_dial
 where sesion= '0/1/0/3886.2241_D90EC01900C01899'
 and rownum =1
 order by time desc)

答案 4 :(得分:0)

UPDATE  stat.stat_dial 
    SET   time=200
    where sesion=? and login =?
    and  rowid = (SELECT min(rowid) 
            FROM stat.stat_dial sd1
            where sd1.sesion = ? 
            or sd1.sesion= ? )
这对我有用。谢谢各位,伙计们。