[mysql] SQL Server에서 중복 행을 삭제하는 방법은 무엇입니까?

존재 하지 않는 중복 행을 어떻게 삭제unique row id 합니까?

내 테이블은

col1  col2 col3 col4 col5 col6 col7
john  1    1    1    1    1    1
john  1    1    1    1    1    1
sally 2    2    2    2    2    2
sally 2    2    2    2    2    2

중복 제거 후 다음과 같이 남겨두고 싶습니다.

john  1    1    1    1    1    1
sally 2    2    2    2    2    2

몇 가지 쿼리를 시도했지만 원하는 결과를 얻지 못하기 때문에 행 ID가 있어야한다고 생각합니다. 예를 들면 다음과 같습니다.

DELETE
FROM table
WHERE col1 IN (
    SELECT id
    FROM table
    GROUP BY id
    HAVING (COUNT(col1) > 1)
)



답변

CTE는 같은 I와 ROW_NUMBER결합 된 두 그러므로 우리 단지 변경, 삭제 (또는 갱신)하는 행을 볼 수 있도록로 DELETE FROM CTE...SELECT * FROM CTE:

WITH CTE AS(
   SELECT [col1], [col2], [col3], [col4], [col5], [col6], [col7],
       RN = ROW_NUMBER()OVER(PARTITION BY col1 ORDER BY col1)
   FROM dbo.Table1
)
DELETE FROM CTE WHERE RN > 1

DEMO (결과는 다릅니다. 오타 때문이라고 가정합니다)

COL1    COL2    COL3    COL4    COL5    COL6    COL7
john    1        1       1       1       1       1
sally   2        2       2       2       2       2

이 예제는로 인해 단일 열로 중복을 결정 col1합니다 PARTITION BY col1. 여러 열을 포함하려면 간단히 다음에 열을 추가하십시오 PARTITION BY.

ROW_NUMBER()OVER(PARTITION BY Col1, Col2, ... ORDER BY OrderColumn)


답변

SQL Server 테이블에서 중복 행을 삭제하는 데 CTE를 선호합니다.

이 기사를 따르는 것이 좋습니다 :: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/

독창성을 유지함으로써

WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY col1,col2,col3 ORDER BY col1,col2,col3) AS RN
FROM MyTable
)

DELETE FROM CTE WHERE RN<>1

원본을 유지하지 않고

WITH CTE AS
(SELECT *,R=RANK() OVER (ORDER BY col1,col2,col3)
FROM MyTable)
 
DELETE CTE
WHERE R IN (SELECT R FROM CTE GROUP BY R HAVING COUNT(*)>1)


답변

사용하지 않고 CTE하고 ROW_NUMBER()그냥 단지로 그룹화를 사용하여 레코드를 삭제할 수 있습니다 MAX여기에 함수 예

DELETE
FROM MyDuplicateTable
WHERE ID NOT IN
(
SELECT MAX(ID)
FROM MyDuplicateTable
GROUP BY DuplicateColumn1, DuplicateColumn2, DuplicateColumn3)


답변

DELETE from search
where id not in (
   select min(id) from search
   group by url
   having count(*)=1

   union

   SELECT min(id) FROM search
   group by url
   having count(*) > 1
)


답변

아래의 삭제 방법도 참조하십시오.

Declare @table table
(col1 varchar(10),col2 int,col3 int, col4 int, col5 int, col6 int, col7 int)
Insert into @table values
('john',1,1,1,1,1,1),
('john',1,1,1,1,1,1),
('sally',2,2,2,2,2,2),
('sally',2,2,2,2,2,2)

이름이 지정된 샘플 테이블을 작성하고 @table지정된 데이터로로드했습니다.

여기에 이미지 설명을 입력하십시오

Delete  aliasName from (
Select  *,
        ROW_NUMBER() over (Partition by col1,col2,col3,col4,col5,col6,col7 order by col1) as rowNumber
From    @table) aliasName
Where   rowNumber > 1

Select * from @table

여기에 이미지 설명을 입력하십시오

참고 : Partition by파트의 모든 열을 제공하는 order by경우 큰 의미가 없습니다.

질문은 3 년 전에 요청되었으며 내 답변은 Tim이 게시 한 내용의 다른 버전이지만, 게시하는 것은 누구에게나 도움이됩니다.


답변

외래 키와 같은 참조가 없으면 이렇게 할 수 있습니다. 개념 증명을 테스트하고 테스트 데이터가 복제 될 때 많이합니다.

SELECT DISTINCT [col1],[col2],[col3],[col4],[col5],[col6],[col7]

INTO [newTable]

개체 탐색기로 이동하여 이전 테이블을 삭제하십시오.

새 테이블의 이름을 이전 테이블의 이름으로 바꿉니다.


답변

Microsoft는 중복 제거 방법에 대한 정확한 안내서를 제공합니다. 체크 아웃 http://support.microsoft.com/kb/139444를 하십시오.

간단히 말해서 몇 줄만 삭제할 때 중복 항목을 삭제하는 가장 쉬운 방법은 다음과 같습니다.

SET rowcount 1;
DELETE FROM t1 WHERE myprimarykey=1;

myprimarykey 는 행의 식별자입니다.

나는 행 개수를 설정두 개의 행만 복제 를 1로 . 3 개의 행이 복제 된 경우 rowcount 를 2로 설정 하여 처음 두 개를 삭제하고 테이블 t1에 하나만 남겨 둡니다.

그것이 누군가를 돕기를 바랍니다.