2012-12-13 1 views
3

테이블에서 중복 레코드를 삭제해야합니다. 구문 : T-SQL (MS SQL 서버)다른 테이블에서 연결된 데이터 세트가있는 행에서 중복 검색

그것은 두 어려움이 있습니다

행 비교에 영향을 미치지 않습니다 데이터를 포함하는 필드가 있습니다
  1. 처음에 링크 추가 표가 있습니다
  2. "일대 다"관계

예 :

Table A     Table B 
--------------   -------------- 
AId - int  <-\  BId - int 
A1 - int   \-> AId - int 
A2 - varchar   B6 - varchar 
A3 - varchar   B7 - varchar 
A4 - varchar   B8 - varchar 
A5 - int    B9 - int 

따라서 표 A의 모든 레코드에는 AId, A1, A2, A3, A4 및 A5 필드와 B. 하위 레코드 목록이 포함됩니다. B.AId가 A.AId와 일치하는 표 B의 레코드 목록. 예를 들어, 표 A에는 날짜/시간 또는 고객 ID와 같은 트랜잭션 특성이 들어있는 구매 트랜잭션 목록이 될 수 있으며 표 B는 가격 및 금액이 표시된 상품 목록을 나타낼 수 있습니다.

일부 레코드가 복제되면. 그들에는 다른 AId, 다른 BId, 다른 A4, A5, B8 및 B9가있다. 다른 모든 필드는 두 레코드가 중복되도록 일치해야합니다.

따라서, 기록의 두 X 및 Y를 고려 중복 된 경우 :

  • X.A1 == Y.A1
  • X.A2 == Y.A2
  • 모든 레코드로부터 도움으로 표 B는 == X.AId 완전히 == 도움으로 Y.AId을 B에서 모든 기록과 일치하지만, 제외 (무시) ​​B8 및 B9 필드는

나는 적어도 같은 중복 레코드의 에이즈를 얻을 필요 , 최대로 그 사본을 지우지 만 오직 하나의 사본 만 남겨 두었다. (어떤 것이 든 상관 없다).

다음 설명이 필요한 경우 알려주십시오. 미리 감사드립니다.

UPD : SQL 바이올린 : http://sqlfiddle.com/#!3/898c8/1

답변

0
Select a1, Count(CompareField) From (Select a.a1 as a1, a.a1 + a.a2 + a.a3 + b.b6 + b.b7 as compareField from A inner join b on a.AID = b.AID) z Group by z.comparefield 

이 다음 레코드 (prevquery)의 경우 AID에서 삭제 삭제 외부 쿼리를 사용할 수 있습니다 당신에게 모든 중복의 목록을 얻을 것이다

아마도 명시 할 필요는 없지만 삭제를 실행하기 전에 데이터베이스를 백업해야합니다. :)

+0

감사합니다. 그러나 http://sqlfiddle.com/#!3/898c8/1을 조정할 수 있습니까? 최종 출력에는 AID 1과 2가 있어야합니다. B7의 행 중 하나에 다른 값이 있으므로 3과 4는 계산되지 않습니다. – 12345

+0

전혀 작동하지 않는 것 같습니다. – 12345

0

트릭은 테이블 B의 여러 행을 단일 문자열로 연결하는 것입니다. 당신이 XML 기능을 남용 할 수 SQL 서버의

(값에 특수 문자가있는 경우 문제가 될 수있다 - 다른 사람이 쉼표로 구분 된 목록을 반환베이스에서 LIST() 같은 내장 함수) :

SELECT AID, A1, A2, A3, (
    SELECT B6, B7 
    FROM B 
    WHERE AID=A.AID 
    ORDER BY B6, B7 
    FOR XML RAW 
) XML 
FROM A 

http://sqlfiddle.com/#!3/898c8/29/0

이제 평평한 테이블이 그것을 찾아 (독자들에게 숙제로 남긴다되는) 중복 삭제 쉽게 ...