2013-06-19 2 views
0

이 삭제 쿼리를 작성하여 테이블에서 중복 항목을 제거했지만이 쿼리를 실행하면 이전 행이 유지되고 최신 행이 삭제됩니다. 가장 최근에 삽입 된 행을 유지하고 이전 행을 삭제하려고합니다. 삭제 쿼리에 ORDER BY 절이 추가되었지만 작동하지 않습니다.ORDER BY with DELETE not working

DELETE t2 
FROM user_deprovision t1 
JOIN user_deprovision t2 ON (
    t2.UserName = t1.UserName AND 
    t2.GroupName = t1.Groupname AND 
    t2.id > t1.id) 
ORDER BY t1.DeletedDate; 

어떻게하면됩니까?

+0

제거는'잘못 t2'.its. – som

+0

왜 주문을 주문 하시겠습니까? 말도 안돼. – Tomalak

+0

@tomalak : 작동하는 경우 ORDER BY를 시도한 데이터 만 최신 데이터로 유지하려고합니다. –

답변

0

사용자 이름과 그룹 이름의 최신 시간을 반환하는 쿼리를 작성해 보겠습니다.

SELECT 
    UserName, GroupName, MAX(deprovision_time) 
FROM 
    user_deprovision 
GROUP BY 
    UserName, GroupName 

이제 이것을 용도에 맞게 조정 해 보겠습니다. 오라클에서는 이것을 임시 테이블로 바꾸는 작업을 수행 할 수도 있지만 여기에서는 상관 관계가있는 하위 쿼리를 사용합니다.

DELETE FROM user_deprovision AS dp1 
WHERE dp1.deprovision_time < 
    ANY (SELECT deprovision_time FROM user_deprovision AS dp2 
     WHERE dp1.UserName = dp2.UserName 
     AND dp1.GroupName = dp2.GroupName); 

우리는 이것을 결합으로 바꿀 수 있습니다.

SELECT dp1.id 
FROM user_deprovision AS dp1 
JOIN user_deprovision AS dp2 
ON  dp1.UserName = dp2.UserName 
AND dp1.GroupName = dp2.GroupName 
WHERE 
     dp1.deprovision_time < dp2.deprovision_time 

그리고 해당 삭제는 다음과 같습니다

DELETE FROM user_deprovision 
WHERE id IN (
    SELECT dp1.id 
    FROM user_deprovision AS dp1 
    JOIN user_deprovision AS dp2 
    ON  dp1.UserName = dp2.UserName 
    AND dp1.GroupName = dp2.GroupName 
    WHERE 
      dp1.deprovision_time < dp2.deprovision_time);