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
'programing' 카테고리의 다른 글
기본 null 매개 변수로 절차를 실행할 수 있습니까? (0) | 2023.07.25 |
---|---|
jQuery를 사용하여 표 행을 반복하고 셀 값을 가져오는 방법 (0) | 2023.07.25 |
가져오기 오류: 이름이 6인 모듈이 없습니다. (0) | 2023.07.25 |
SQL 구문은 대소문자를 구분합니까? (0) | 2023.07.25 |
개체의 값을 사용하여 키 (0) | 2023.07.25 |