2015-12-23 9 views
5

SQL Server hakkında bir sorum var.Yinelenen verileri silme ve SQL Server'da başka bir tabloya yükleme

Tablo: emp

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

Bu tablo I emp masanın

yinelenen verileri silmek Ve verileri empduplicate tabloya yüklü olmalıdır çoğaltmak istediğiniz yukarıdaki tabloya göre yinelenen veri var.

Burada empid benzersizdir. empid birden çok kez gösteriliyorsa, o kayıt bir kopya olarak kabul edilir.

empduplicate yapısı şuna benzer:

Empid | name | sal 

Son olarak yinelenen verileri sildikten sonra, böyle bakmak emp tablodaki verileri görmek istiyorum:

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

çiftleri silme, ben bu kodu çalıştı :

( ) tüm kayıtlar silinir.

Örnek: empid=2 tekrarlanan verileri Ben tüm empid=2 gelen kayıtları silmeniz gerekir

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

sahiptir. empid=2, çoğaltılmış ve emp tablosundan silmeye ihtiyaç var.

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

: Bu sorgu bir hata atar

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 

yinelenen verileri ekleme için ben bu kodu çalıştı:

Ve empduplicate tablo şuna benzer tekrarlanan verileri yüklemek gerekir

Lütfen SQL Server 0'daki görevime ulaşmak için nasıl sorgu yazacağımı söyleyin

cevap

2

Neredeyse oradasınız. Yerine ROW_NUMBER kullanmak yerine, COUNT kullanın:

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; 

Sen DELETE önce INSERT ilk yürütmek gerekiyor. Ayrıca, bunu tek bir işlemde de kapsaymak isteyebilirsiniz.

+0

sayesinde çalışma ince – 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.