2014-07-07 1 views
0

다음 SQL을 선택했습니다. 어떻게 하나의 행을 유지하지만 중복을 삭제할 수 있도록 그것을 삭제 진술로 변환 할 수 있습니까?중복을 삭제하지만 여러 열 키를 사용하여 1을 유지하십시오.

select s.ForsNr, t.* 
from [testDeleteDublicates] s 
join (
    select ForsNr, period, count(*) as qty 
    from [testDeleteDublicates] 
    group by ForsNr, period 
    having count(*) > 1 
) t on s.ForsNr = t.ForsNr and s.Period = t.Period 
+0

있는 테이블에서 u는 삭제할? –

+0

testDeleteDublicates – user3688856

+1

데이터를 표시하거나 바이올린을 만드시겠습니까? OLDEST 레코드를 유지하고 'testDeleteDublicates'에서 새 레코드를 삭제 하시겠습니까? 즉 나중에 추가되는 모든 레코드를 삭제하고 이전 레코드를 유지 하시겠습니까? –

답변

0

다음 사용해보십시오 :

방법 1 :

DELETE FROM Mytable WHERE RowID NOT IN (SELECT MIN(RowID) FROM Mytable GROUP BY Col1,Col2,Col3) 

방법 2 :

;WITH cte 
    AS (SELECT ROW_NUMBER() OVER (PARTITION BY ForsNr, period 
             ORDER BY (SELECT 0)) RN 
     FROM testDeleteDublicates) 
DELETE FROM cte 
WHERE RN > 1 

희망이 도움이!

참고 : 당신의 필요에 따라 테이블 & 열 이름을 변경하십시오!

+0

우리는 하나의 테이블만을보고 있습니다. ID 열 없음 – user3688856

+0

예. ID 열을 추가하면 작동합니다! Thx – user3688856

+0

나는 내 대답을 업데이 트했습니다 같은 다른 방법을 확인하십시오! –

0

생성 된 기본 키 열이있는 한 쉽습니다 (좋은 생각입니다). 각 중복 그룹의 min (id)을 선택하고 다른 모든 것을 삭제할 수 있습니다. 중복되지 않은 행의 ID도 삭제에서 제외되도록 having 절을 제거했습니다.

delete from [testDeleteDublicates] 
where id not in (
    select Min(Id) as Id 
    from [testDeleteDublicates] 
    group by ForsNr, period 
) 

당신은 당신이 자신의 구현은 공급 업체에 공급 업체의 변화에 ​​따라 좀 더 가로장 설치 등등이 될 것입니다 행 번호를 사용하여 동일한 효과를 얻을 수있다 인공 기본 키가없는 경우.

+0

완벽하고 간단합니다! – user3688856

+0

내 모든 행을 삭제합니다 :) – user3688856

0

2 가지 옵션을 사용할 수 있습니다. Add primary-key and delete accordingly

http://www.mssqltips.com/sqlservertip/1103/delete-duplicate-rows-with-no-primary-key-on-a-sql-server-table/

'2

  1. . partition 옵션과 함께 row_number()를 사용하면 각 행에 런타임을 추가하고 중복 행을 삭제할 수 있습니다.

    Removing duplicates using partition by SQL Server

    --give group by field in partition. 
    ;with cte(
        select ROW_NUMBER() over(order by ForsNr, period partition ForsNr, period) RowNo , * from [testDeleteDublicates] 
        group by ForsNr, period 
        having count(*) > 1 
    ) 
    
    select RowNo from cte 
    group by ForsNr, period 
    
관련 문제