존재 하지 않는 중복 행을 어떻게 삭제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에 하나만 남겨 둡니다.
그것이 누군가를 돕기를 바랍니다.