Ответ 1
Будет ли это работать для вас:
update duptest
set nonid = 'c'
WHERE ROWID IN (SELECT MIN (ROWID)
FROM duptest
GROUP BY id, nonid)
Я ищу инструкцию UPDATE, в которой он будет обновлять только одну повторяющуюся строку и оставаться остальной (повторяющиеся строки) неповрежденными как есть, используя ROWID или что-то еще или другие элементы для использования в Oracle SQL или PL/SQL?
Вот пример дублированной таблицы для работы с:
CREATE TABLE duptest (ID VARCHAR2(5), NONID VARCHAR2(5));
запустите один INSERT INTO duptest VALUES('1','a');
выполните четыре (4) раза INSERT INTO duptest VALUES('2','b');
Кроме того, первая повторяющаяся строка должна обновляться (не удаляться) всегда, тогда как остальные три (3) должны быть оставлены как есть!
Большое спасибо, Val.
Будет ли это работать для вас:
update duptest
set nonid = 'c'
WHERE ROWID IN (SELECT MIN (ROWID)
FROM duptest
GROUP BY id, nonid)
Это сработало для меня, даже для повторных прогонов.
--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
)
Я думаю, что это должно сработать.
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
)
UPDATE duptest
SET nonid = 'c'
WHERE nonid = 'b'
AND rowid = (SELECT min(rowid)
FROM duptest
WHERE nonid = 'b');
Я знаю, что это не отвечает на ваш первоначальный вопрос, но в вашей таблице нет ключа, и проблема, с которой вы ссылаетесь на определенную строку, получается из этого.
Итак, мое предложение - если конкретное приложение разрешает это - должно было бы добавить в таблицу ключевой столбец (например, REAL_ID как INTEGER).
Затем вы можете узнать самый низкий идентификатор для дубликатов
select min (real_id)
from duptest
group by (id, nonid)
и обновите только эти строки:
update duptest
set nonid = 'C'
where real_id in (<select from above>)
Я уверен, что оператор обновления может быть настроен несколько, но я надеюсь, что это иллюстрирует идею.
Преимущество - это "более чистый" дизайн (ваш столбец id на самом деле не является идентификатором) и более портативное решение, чем использование конкретных версий DBid.