2013-10-09 66 views
0

在我的数据库中,我有相同的行。我只需要更新一行。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) 
+1

2点要注意1.'这里的rownum =如果使用where子句选择''是不行的(选择stat.stat_dial' * 2.无需要'为了by'时,特别提到对'ronwnum = 1 ' – Pratik

+0

添加要表的架构和所需的输出。 – Pratik

+0

我想你想用'rowid'(这是一个内部的“钥匙”在一个表中的行),而不是'rownum'(这仅仅是一个序列号分配到每一行,因为它是返回)看到@ vasja的答案看起来像它会工作 –

回答

4

每行应该有一个唯一的主键这是第一种正常形式。

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

+0

我总是说,如果你的表没有一个键,你没有数据,你有垃圾 –

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) 
+0

这看起来是正确的我的 –

+0

多数民众赞成在工作呢! –

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结果子查询返回一行。

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) 
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= ?) 

这就是为我工作。感谢大家,伙计。