11

Oracle SQLまたは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 行はそのままにしておく必要があります。

どうもありがとう、ヴァル。

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>)

update ステートメントを多少調整できると確信していますが、アイデアを説明してくれることを願っています。

利点は、「よりクリーンな」設計 (id 列は実際には id ではない) であり、DB 固有のバージョンの rowid に依存するよりも移植性の高いソリューションです。

于 2008-10-29T06:36:08.963 に答える