我正在寻找一个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。
答案 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更便携的解决方案。