2015-12-23 17 views
5

SQL Serverに関する質問があります。重複するデータを削除し、SQL Serverの別のテーブルにロードします

表:emp

empid | name |sal 
1  | abc |100 
2  | def |200 
3  | test |300 
2  | har |500 
3  | jai |600 
4  | kali |240 

このテーブルには、私がempテーブル

から重複データを削除したデータはempduplicateテーブルにロードする必要があり、重複たい上記の表に基づいて重複したデータを持っています。

ここでempidはユニークです。 empidが複数回現れた場合、そのレコードは重複していると見なされます。

empduplicate構造は次のようになります。

Empid | name | sal 

は、最後に重複データを削除した後、私はempテーブル内のデータは次のようになり見たい:

empid | name | sal 
1  | abc | 100 
4  | kali | 240 

重複を削除するために、私はこのコードを試してみました:

;with duplicate as 
(
    select 
     *, 
     row_number()over (partition by empid order by empid) as rn 
    from emp 
) 
delete from duplicate 
where rn > 1 

しかし、私はできません全体のレコードをelete。

例:empid=2は、私は全体empid=2対応するレコードを削除する必要が

empid|name |sal 
2 |def |200 
2 |har |500 

重複データを持っています。 empid=2は重複しており、テーブルから削除する必要があります。

Column 'duplicate.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

:そのクエリがエラーをスローし

insert into empduplicate 
    select 
     id, name, sal 
    from 
     emp 
    group by 
     id 
    having 
     count(*) > 1 

empid | name |sal 
2  |def  |200 
2  |har  |500 
3  |test |300 
3  |jai  |600 

重複データを挿入するために、私はこのコードを試してみました:

そしてempduplicateテーブルは次のようになり、重複データをロードする必要があります

SQL Serverで自分のタスクを達成するためのクエリを書く方法を教えてください

答えて

2

あなたはほぼあります。代わりにROW_NUMBERを使用しての、COUNTを使用します。

WITH CteInsert AS(
    SELECT *, 
     cnt = COUNT(empid) OVER(PARTITION BY empid) 
    FROM emp 
) 
INSERT INTO empduplicate(empid, name, sal) 
SELECT 
    empid, name, sal 
FROM CteInsert 
WHERE cnt > 1; 

WITH CteDelete AS(
    SELECT *, 
     cnt = COUNT(empid) OVER(PARTITION BY empid) 
    FROM emp 
) 
DELETE FROM CteDelete WHERE cnt > 1; 

あなたはDELETEINSERT最初に実行する必要があります。さらに、単一のトランザクションでこれを囲むこともできます。

+0

おかげでその作業罰金 – ravi

0
BEGIN TRAN 
SELECT * INTO empduplicate FROM 
(
SELECT * 
FROM emp 
WHERE empid IN (
    SELECT empid FROM emp 
    GROUP BY empid 
    HAVING COUNT(empid)>1 
) 
) as M 

DELETE FROM emp WHERE empid IN (
SELECT empid FROM emp 
GROUP BY empid 
HAVING COUNT(empid)>1 
) 

COMMIT TRAN 
0
SELECT DISTINCT * INTO #tmp FROM emp 
DELETE FROM emp 
INSERT INTO emp 
SELECT * FROM #tmp DROP table #tmp 

SELECT * FROM emp ---------------------------- All Distinct ID 

SELECT * INTO #tmp FROM emp 
WHERE empid in(
    SELECT empid FROM emp 
    group by empid having count(*) = 1 
) 
DELETE FROM emp 
INSERT INTO emp 
SELECT * FROM #tmp DROP table #tmp 

SELECT * FROM emp ----------------------------All ID which is not duplicate 

INSERT INTO empduplicate 
    SELECT * FROM emp where empid in(
    SELECT empid FROM emp 
    group by empid having count(*) >1 
) 

SELECT * FROM empduplicate -------------------ALL Duplicate value. 
関連する問題