2014-04-14 4 views
4

안녕하세요 나는 내가 for delete row는하지만, 그것은이다 이 링크에서 쿼리를 발견 데이터베이스에 두 행을 유지하고 다른 모든 행을 을 삭제하려면 , 문제가 mysql 구문 한계 함수를 제공합니다. 이지만 Oracle에서는 제한 없음 변수를 사용할 수 있습니다. 어떻게 할 수 있습니까?행을 삭제하는 동안

DELETE FROM Table 
    WHERE DateColumn NOT IN (SELECT DateColumn 
          FROM Table 
         GROUP BY date(DateColumn) 
         ORDER BY DateColumn DESC 
          LIMIT 2); 

답변

1

이 택시는이 쿼리를 통해

DELETE FROM TABLE 
WHERE ROWID NOT IN 
    (SELECT ROWIDS FROM (SELECT MIN(ROWID) ROWIDS 
          FROM TABLE 
          GROUP BY DATECOLUMN 
          ORDER BY DATECOLUMN DESC) 
     WHERE ROWNUM <= 2); 

내부 대부분의 쿼리가 ROWID의 분을 반환합니다 테이블에서의 후 즉시 외부 쿼리를 선택합니다을 달성 할 수 가장 바깥 쪽의 삭제에서는 피할 수있는 행이 두 개뿐입니다.

+0

min (rowid)으로 인해 하나를 제외한 모든 행을 삭제합니다. –

+0

@TommyGrovnes datecolumn에 그룹화되어 있기 때문에 반환합니다 datecolumn에 의해 형성된 그룹의 수만큼의 최소 rowid. – San

+0

모든 행의 날짜가 같으면 한 행만 남기 때문에 행 하나만 남겨 둡니다. (극단적 인 예이지만 여전히 그렇습니다) –

2

사용 ROWID (테스트하지)이 같은 ROWNUM 및 하위 쿼리 뭔가

delete from table WHERE rowid NOT IN 
    (SELECT rowid FROM (SELECT rowid 
          FROM Table 
         ORDER BY DateColumn DESC) 
    WHERE rownum <= 2); 

공지 사항은 "더블"가 필요 선택 때문에으로 순서에 혼잡이이 후 적용으로 ROWNUM ROWNUM

로 단순화 할 수있는 날짜는 중요하지 않으며, 당신은 단지 (임의) 두 행을 유지하려면210
0
DELETE FROM Table 
    WHERE DateColumn NOT IN (SELECT DateColumn 
          FROM Table 
          Where ROWNUM < 3 
          GROUP BY date(DateColumn) 
          ORDER BY DateColumn DESC 
          ); 

쿼리를 실행하는 Oracle 클라이언트가 없습니다. LIMIT는 ORACLE에서 사용할 수 없습니다 당신은 오라클에서 ROWNUM을 사용할 수 있습니다

+1

날짜가 고유하지 않으면 2 행 이상 남을 수 있으며, rownum은 –

+0

동의 함으로 주문을 파기합니다. 고유 한 날짜가 아니면 2 행 이상을 남겨 둘 수 있지만 LIMIT 옵션의 경우에도 동일합니다. –

+0

질문에 –

관련 문제