Oracle中的UPDATE语句使用SQL或PL / SQL仅更新第一个重复行

时间:2008-10-28 20:12:15

标签: sql oracle plsql sql-update

我正在寻找一个UPDATE语句,它只更新一个重复的行并保持其余的(重复的行)完好无损 就像在Oracle SQL或PL / SQL中使用ROWID或其他东西或其他元素一样?

以下是一个使用的示例duptest表:

CREATE TABLE duptest (ID VARCHAR2(5), NONID VARCHAR2(5));
  • 运行一个INSERT INTO duptest VALUES('1','a');

  • 运行四(4)次INSERT INTO duptest VALUES('2','b');

此外,第一个重复行必须始终更新(不删除),而其他三个(3)必须保持不变!

非常感谢, VAL。

5 个答案:

答案 0 :(得分:15)

这对你有用吗?

update duptest 
set nonid = 'c'
WHERE ROWID IN (SELECT   MIN (ROWID)
                              FROM duptest 
                          GROUP BY id, nonid)

答案 1 :(得分:1)

这对我有用,即使是重复运行。

--third, update the one row
UPDATE DUPTEST DT
SET DT.NONID = 'c'
WHERE (DT.ID,DT.ROWID) IN(
                         --second, find the row id of the first dup
                         SELECT 
                           DT.ID
                          ,MIN(DT.ROWID) AS FIRST_ROW_ID
                         FROM DUPTEST DT
                         WHERE ID IN(
                                    --first, find the dups
                                    SELECT ID
                                    FROM DUPTEST
                                    GROUP BY ID
                                    HAVING COUNT(*) > 1
                                    )
                         GROUP BY
                           DT.ID
                         )

答案 2 :(得分:1)

我认为这应该有用。

UPDATE DUPTEST SET NONID = 'C'
WHERE ROWID in (
    Select ROWID from (
        SELECT ROWID, Row_Number() over (Partition By ID, NONID order by ID) rn
    ) WHERE rn = 1
)

答案 3 :(得分:1)

UPDATE  duptest 
SET     nonid = 'c' 
WHERE   nonid = 'b' 
    AND rowid = (SELECT min(rowid) 
                 FROM   duptest 
                 WHERE nonid = 'b');

答案 4 :(得分:0)

我知道这不能解答您的初始问题,但是您的桌子上没有任何关键字,而且您可以解决特定行的问题。

所以我的建议 - 如果特定的应用程序允许它 - 将为您的表添加一个键列(例如REAL_ID为INTEGER)。

然后你可以找出重复项的最低ID

select min (real_id) 
from duptest
group by (id, nonid)

并仅更新这些行:

update duptest
set nonid = 'C'
where real_id in (<select from above>)

我确信更新声明可以稍微调整一下,但我希望它能说明这个想法。

优点是“更干净”的设计(您的id列不是真正的id),是一种比依赖DB特定版本的rowid更便携的解决方案。