在我的数据库中,我有相同的行。我只需要更新一行。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)
在我的数据库中,我有相同的行。我只需要更新一行。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)
每行应该有一个唯一的主键这是第一种正常形式。
如果你没有,你有更大的问题。您应该尽快更改该数据库。
我总是说,如果你的表没有一个键,你没有数据,你有垃圾 –
我目前还无法证实这一点,但也许它会工作:
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)
这看起来是正确的我的 –
多数民众赞成在工作呢! –
你可以更新具有满足您的条件的最低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结果子查询返回一行。
您查询是不是真的只是小问题,试试这个:
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)
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= ?)
这就是为我工作。感谢大家,伙计。
2点要注意1.'这里的rownum =如果使用where子句选择''是不行的(选择stat.stat_dial' * 2.无需要'为了by'时,特别提到对'ronwnum = 1 ' – Pratik
添加要表的架构和所需的输出。 – Pratik
我想你想用'rowid'(这是一个内部的“钥匙”在一个表中的行),而不是'rownum'(这仅仅是一个序列号分配到每一行,因为它是返回)看到@ vasja的答案看起来像它会工作 –