2017-02-26 1 views
0

나는 그것이 어떻게 일어 났는지 전혀 모른다는 별난 경우가있다. OID로 레코드를 삭제하는 방법은 무엇입니까?

내 테이블 : ID가 NULL하고 자동으로 증가 할 수

id 
date 
amount 

. 이 원인

OID  id  date amount 
710604512 197 2015-03-11 10657.61 
710604513 197 2015-03-11 10657.61 

ID와 같은 큰 문제가 고유해야합니다 :

누군가가 작년 시스템은 다음과 같은 상황을 만들었습니다.
내가 수행 할 조치가 두 행에서 모두 수행되므로 일반 SQL에서이를 수정할 수 없습니다.

그 중 하나를 삭제해야합니다.

나는 그것의 OID에 의해 날짜 (그것이 창조의 날짜를 기록하고 로그가 표시됩니다)

어떻게 행을 삭제할 수 있습니다 함께 플레이 할 수 없기 때문에 모두 삭제하고 하나를 삽입하는 솔루션은 용납? 당신이 기록을 삭제하려면

답변

2

작은 중복이 발생하는OID은, 당신이 시도 할 수 있습니다 :

WITH cte AS (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY id, date, amount ORDER BY OID DESC) AS rn 
    FROM yourTable 
) 
DELETE FROM cte WHERE rn=2;  -- or rn >=2 to delete all duplicates 

OID와 기록을 삭제하려면 단지 ORDER BY 절을 변경 여기까지 :

ORDER BY OID 
+1

감사합니다. 나는 OID를 걸러 낼 수 있는지 몰랐다. – avi

1

각 ID에 대해 최대 OID로 행을 유지하려는 경우 t 그의 :

delete 
from your_table t1 
    using (
     select id, max(OID) 
     from your_table 
     group by id 
     ) t2 
where t1.id = t2.id and t1.OID <> t2.OID; 

또는 : 귀하의 경우 비즈니스 핵심

delete 
from your_table t1 
where exists (
    select 1 
    from your_table t2 
    where t1.id = t2.id 
    and t1.OID < t2.OID 
); 
1

id, date, amount 경우,이 열로 그룹화하여 두 번째 넘어 모든 레코드를 제거 할 수 있습니다. 이런 식으로 뭔가 :

DELETE FROM theTable 
WHERE OID IN (
    SELECT OID 
    FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY id, date, amount) AS RowNo, OID 
      FROM tab) x 
    WHERE x.RowNo > 1); 

참고 :이 중복의 수에 관계없이 작동합니다.

관련 문제