OracleSQLまたはPL/SQLで利用するROWIDまたはその他の要素またはその他の要素を使用して、単一の重複行のみを更新し、残り(重複行)をそのまま維持するUPDATEステートメントを探していますか?
使用するduptestテーブルの例を次に示します。
_CREATE TABLE duptest (ID VARCHAR2(5), NONID VARCHAR2(5));
_
1つ実行するINSERT INTO duptest VALUES('1','a');
4回実行するINSERT INTO duptest VALUES('2','b');
また、最初の重複行は常に更新(削除ではない)する必要がありますが、他の3つはそのままにしておく必要があります。
どうもありがとう、ヴァル。
これはあなたのために働きますか:
update duptest
set nonid = 'c'
WHERE ROWID IN (SELECT MIN (ROWID)
FROM duptest
GROUP BY id, nonid)
UPDATE duptest
SET nonid = 'c'
WHERE nonid = 'b'
AND rowid = (SELECT min(rowid)
FROM duptest
WHERE nonid = 'b');
これは、繰り返し実行した場合でも、私にとってはうまくいきました。
--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
)
これはあなたの最初の質問に答えないことを私は知っていますが、あなたのテーブルには鍵がなく、あなたが特定の行に対処している問題はそれから生じます。
したがって、私の提案(特定のアプリケーションで許可されている場合)は、テーブルにキー列を追加することです(たとえば、INTEGERとしてのREAL_ID)。
次に、重複の最小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に依存するよりも移植性の高いソリューションです。