programing

SQL 또는 PL/SQL을 사용하여 첫 번째 중복 행만 업데이트하는 Oracle의 UPDATE 문

linuxpc 2023. 7. 25. 20:42
반응형

SQL 또는 PL/SQL을 사용하여 첫 번째 중복 행만 업데이트하는 Oracle의 UPDATE 문

Oracle SQL 또는 PL/SQL에서 사용할 ROWID 또는 다른 요소를 사용하여 단일 중복 행만 업데이트하고 나머지(중복 행)는 그대로 유지하는 UPDATE 문을 찾고 있습니다.

다음은 작업할 중복 테스트 테이블의 예입니다.

CREATE TABLE duptest (ID VARCHAR2(5), NONID VARCHAR2(5));
  • 한 방 먹음INSERT INTO duptest VALUES('1','a');

  • 네 번 뛰다INSERT INTO duptest VALUES('2','b');

또한 첫 번째 중복 행은 항상 업데이트(삭제되지 않음)해야 하며, 나머지 세 행은 그대로 유지해야 합니다!

정말 고마워, 발.

이것이 당신에게 효과가 있습니까?

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는 INTER)입니다.

그러면 당신은 복제품에 대한 가장 낮은 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에 의존하는 것보다 더 휴대성이 뛰어난 솔루션입니다.

언급URL : https://stackoverflow.com/questions/244671/update-statement-in-oracle-using-sql-or-pl-sql-to-update-first-duplicate-row-onl

반응형