2013-10-09 65 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= ?) 

這就是爲我工作。感謝大家,夥計。