11

我正在寻找一个 UPDATE 语句,它将仅更新单个重复行并保持其余(重复行)不变,使用 ROWID 或其他东西或其他元素在 Oracle SQL 或 PL/SQL 中使用?

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

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

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

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

非常感谢,瓦尔。

4

5 回答 5

15

这对你有用吗:

update duptest 
set nonid = 'c'
WHERE ROWID IN (SELECT   MIN (ROWID)
                              FROM duptest 
                          GROUP BY id, nonid)
于 2008-10-28T20:33:09.990 回答
1
UPDATE  duptest 
SET     nonid = 'c' 
WHERE   nonid = 'b' 
    AND rowid = (SELECT min(rowid) 
                 FROM   duptest 
                 WHERE nonid = 'b');
于 2008-11-10T04:10:43.820 回答
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
                         )
于 2008-10-28T20:45:50.060 回答
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
)
于 2008-10-28T21:01:09.623 回答
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 更便携的解决方案。

于 2008-10-29T06:36:08.963 回答