2011-10-28 2 views
3

Netezza는 기본 키에 대한 제약 조건 검사를 지원하지 않기 때문에 테이블에 중복 레코드가 있습니다. 즉, 정보가 정확히 동일한 레코드가 하나 있는데 그 중 하나만 삭제하려고합니다. 나는SQL에서 일부 기준과 일치하는 레코드 하나를 어떻게 삭제합니까? (Netezza)

delete from table_name where test_id=2025 limit 1 

와 두 옵션 모두 작동하지만 또한

delete from table_name where test_id=2025 rowsetlimit 1 

일을 시도했습니다. 오류가 발생합니다.

found 'limit'. Expecting a keyword 

이 쿼리에서 삭제 된 레코드를 제한하는 방법이 있습니까? 나는 내가 레코드를 지우고 다시 삽입 할 수 있다는 것을 알고있다. 그러나 나는 이것을 여러 번해야 할 것이기 때문에 지루하다. 그 지원 중 하나 또는 "LIMIT"키워드 "TOP 1을 삭제"를하지 않는 경우

이 SQL Server가 없거나 MySQL.This 있습니다이 네티

답변

3

을 위해, 당신은을 가진 끝낼 수 있습니다 다음 중 하나를 수행하십시오.

1) 자동 증가 열 (예 : ID)을 추가하여 각 행을 고유하게 만듭니다. Netezza에서 테이블을 작성한 후에도 그렇게 할 수 있는지는 잘 모르겠습니다.

2) 프로그래밍 방식으로 전체 테이블을 읽고 프로그래밍 방식으로 중복을 제거한 다음 모든 행을 삭제하고 다시 삽입하십시오. 다른 테이블에서 참조하는 경우 가능하지 않을 수 있습니다.이 경우 일시적으로 제약 조건을 제거해야 할 수 있습니다.

도움이 되었기를 바랍니다. 저희에게 알려주십시오.

그리고 나중에 참조 할 수 있도록; 이것이 제가 개인적으로 인 이유입니다.은 자동 증가 ID 필드를 만듭니다. :) 기록이 동일 할 경우

+0

않습니다. 나는 나쁜 소식을 좋아하지 않지만 전 메신저를 비난 할 수는 없다고 생각합니다. 감사. – Rondel

1

은 다음

CREATE TABLE DUPES as 
SELECT col11,col2,col3,col....... coln from source_table where test_id = 2025 
group by 
1,2,3..... n 

DELETE FROM source_table where test_id = 2025 

INSERT INTO Source_table select * from duoes 

DROP TABLE DUPES 

같은 것을 할 수있는 당신은 자동으로 속는을 찾기 위해 COUNT (*)> 1을 가진 모든 test_ids을 선택하는 하위 쿼리를 만들 수 있습니다 1과 3

+0

그냥 복제본을 새 테이블에 삽입 한 다음 복제본을 원래 테이블에 다시 삽입하지 않습니까? 나는 아이디어의 기본을 좋아한다. – Rondel

0

1,2,3 BY 그룹이, ..., n은

D.

3

아래 쿼리가 DELE 작동 임시 테이블에 삽입에 속는을 제거 할 단계 테이블에서 중복 된 데이터.

DELETE FROM YOURTABLE 
WHERE COLNAME1='XYZ' AND 
(
COLNAME1, 
ROWID 
) 
NOT IN 
(
SELECT COLNAME1, 
     MAX(ROWID) 
FROM YOURTABLENAME 
WHERE COLNAME = 'XYZ' 
GROUP BY COLNAME1 
) 
1
-- remove duplicates from the <<TableName>> table 
    delete from <<TableName>> 
    where rowid not in 
    (
    select min(rowid) from <<TableName>> 
    group by (col1,col2,col3) 
); 
-1

은 ... 이용 ROWID가 지금까지 내 지식 내가이 쿼리가 Netezza를 실행 것이라고 생각하지 않는 문제이기 때문에 ... 네티에서 허용이 도움이

관련 문제