CREATE TABLE [dbo].[Auth_Role_Page](
[role_page_idx] [int] NOT NULL,
[com_code] [nvarchar](5) NULL,
[role_id] [nvarchar](20) NULL,
[page_id] [varchar](8) NULL,
[reg_date] [datetime] NULL,
[reg_userid] [nvarchar](20) NULL,
[pop] [char](1) NULL,
)
GO
위같은 테이블이 있고
아래 같은 중복된 데이터가 포함된 테이블이 있습니다
role_page_idx com_code role_id page_id reg_date
724312 C0005 admin B741 2013-01-09 23:07:09.933
724314 C0005 admin B739 2013-01-09 23:07:09.933
728245 C0005 admin B739 2013-06-29 16:16:47.827
728266 C0005 admin B741 2013-06-29 16:17:03.630
737687 C0005 root B786 2013-09-17 13:32:27.647
737688 C0005 root B786 2013-09-17 13:32:27.647
737689 C0005 root B786 2013-09-17 13:32:27.647
742160 C0005 admin G843 2014-03-17 09:20:20.940
742161 C0005 admin G843 2014-03-17 09:20:20.940
742162 C0005 admin G843 2014-03-17 09:20:20.940
742163 C0005 root G843 2014-03-17 09:20:20.940
742164 C0005 root G843 2014-03-17 09:20:20.940
742165 C0005 root G843 2014-03-17 09:20:20.940
742166 C0005 user G843 2014-03-17 09:20:20.940
,[com_code]
,[role_id]
,[page_id]
세개 열 합쳐서 중복된 데이터를 제거해야하는데
구글링 해서 소스를 이리저리 수정해봤더니
실행만 되고 실제 삭제는 안되더군요;
몇개 올릴려 했는데 코드를 다지워버린 상태고
아래는 수정할려다가 값을 뭘 넣어야하는지 몰라서 수정 실패한 코드입니다.
어떻게 수정해야 실제로 중복된 데이터를 지우고 하나만 남게 할수 있을까요?
SELECT DISTINCT *
INTO duplicate_table
FROM [tjm_edms].[dbo].[Auth_Role_Page]
GROUP BY [com_code]
,[role_id]
,[page_id]
HAVING COUNT(key_value) > 1
DELETE [tjm_edms].[dbo].[Auth_Role_Page]
WHERE key_value
IN (SELECT key_value
FROM duplicate_table)
INSERT [tjm_edms].[dbo].[Auth_Role_Page]
SELECT *
FROM duplicate_table
DROP TABLE duplicate_table
그리고 마소 지원에서
http://support.microsoft.com/kb/139444/ko
를 수정해봤는데도 작동을 안해버리네요;;
create table t2(col1 int, col2 int,col3 int, col4 char(50))
insert into t2 values (1, 1,1, 'data value one')
insert into t2 values (1, 1,1, 'data value one')
insert into t2 values (1, 1,2, 'data value one')
insert into t2 values (1, 1,2, 'data value one')
insert into t2 values (1, 1,2, 'data value one')
insert into t2 values (1, 1,3, 'data value one')
insert into t2 values (1, 1,3, 'data value one')
insert into t2 values (1, 2,1, 'data value one')
insert into t2 values (1, 3,1, 'data value one')
insert into t2 values (4, 2,2, 'data value one')
insert into t2 values (1, 3,2, 'data value one')
insert into t2 values (1, 4,2, 'data value one')
insert into t2 values (2, 1,3, 'data value one')
insert into t2 values (1, 1,3, 'data value one')
--SELECT col1, col2,col3, count(*)
--FROM t2
--GROUP BY col1, col2,col3
--HAVING count(*) > 1
SELECT col1, col2, col3, col4=count(*)
INTO holdkey
FROM t2
GROUP BY col1, col2,col3
HAVING count(*) > 1
--set rowcount 1
--delete from t2
--where col1=1 and col2=1 and col3=1
SELECT DISTINCT t2.*
INTO holddups
FROM t2, holdkey
WHERE t2.col1 = holdkey.col1
AND t2.col2 = holdkey.col2
AND t2.col3 = holdkey.col3
SELECT col1, col2, col3, count(*)
FROM holddups
GROUP BY col1, col2, col3
이렇게 해도 작동 자체가 안되네요
id를 뭘 넣어야하는지..
DELETE FROM [test].[dbo].[t2]
WHERE [col4] IN (
SELECT A.[col4] [col4]
FROM ( SELECT [col4]
FROM [test].[dbo].[t2]
GROUP BY col1,col2, col3
HAVING COUNT(*) > 1) A)
데이터가 몇건이나 되나요?
일단 중복인지 판단하는 키 컬럼에 인덱스를 만들고
RANK()함수 등을 이용해서 순위를 매긴다음 2위이상은 싹 지워버리는 방법이 생각나네요.