2011-04-21 2 views
2

이상한 질문입니다. 모든 행을 삭제하고 다시 시작하고 싶지는 않지만 일부 행에 ID가 중복되지만 값이 다른 개발 데이터베이스 테이블이 있습니다.동일한 ID를 가진 SQL 삭제 레코드는 1을 남깁니다.

중복 ID가있는 모든 레코드를 삭제하려고하므로 새 버전의 테이블에 데이터 무결성을 적용하고 관계를 만들 수 있습니다. 현재 코드 (레거시)에 의해 삽입되고 생성되는 ID입니다. 나는이있어 또 다른 질문에서

:

delete 
    t1 
from 
    tTable t1, tTable t2 
where 
    t1.locationName = t2.locationName and 
    t1.id > t2.id 

그러나 ID가 같은만큼이 작동하지 않습니다!

ID가 동일한 레코드를 제외한 모든 레코드를 삭제하려면 어떻게해야합니까? 즉, 동일한 ID> 1 인 레코드의 수를 삭제하십시오. 그럴 수 없다면 ID가 중복 된 모든 레코드를 삭제하는 것이 좋습니다.

+0

어떤 DBMS를 사용하고 있습니까? –

+0

@Ash sql server 2005 –

+0

'id' 또는'locationName'에서 중복을 제거 하시겠습니까? – Quassnoi

답변

1
SQL Server 2005에서 이상

: MySQL을위한 확실하지

WITH q AS 
     (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY locationName ORDER BY id) rn 
     FROM tTable 
     ) 
DELETE 
FROM q 
WHERE rn > 1 
1

DB 서버에 따라 다르지만 DELETE 및 LIMIT (mysql) 또는 TOP (sql 서버)를 연결할 수 있습니다.

각 레코드의 첫 번째 (중복 아님)를 임시 테이블로 이동하고 원래 테이블을 삭제 한 다음 임시 테이블을 원래 테이블로 다시 복사 할 수도 있습니다.

1

하지만 MSServer 데이터베이스에 대해 당신이 도움이 다음

SET IDENTITY_INSERT [tablename] ON 
SELECT DISTINCT col1, col2, col3 INTO temp_[tablename] FROM [tablename] 
ALTER TABLE temp_[tablename] ADD IDcol INT IDENTITY 
TRUNCATE TABLE [tablename] 
INSERT INTO [tablename](IDcol, col1, col2, col3) SELECT IDcol, col1, col2, col3 FROM temp_[tablename] 
DROP TABLE temp_[tablename] 

희망을 사용할 수 있습니다.

관련 문제