Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Brisanje dupliciranih podataka

[es] :: MS SQL :: Brisanje dupliciranih podataka

[ Pregleda: 1644 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

SanelD

Član broj: 37995
Poruke: 32
*.rb.a.2-1.247.bih.net.ba.



Profil

icon Brisanje dupliciranih podataka23.06.2006. u 11:26 - pre 217 meseci
Imam tabelu oblika:

ID P_ID IME PREZIME
-----------------------------------
1 5 Ime1 Prezime1
2 7 Ime2 Prezime2
3 5 Ime3 Prezime3
4 5 Ime4 Prezime4
5 8 Ime5 Prezime5
6 9 Ime6 Prezime2
7 7 Ime7 Prezime3
8 1 Ime8 Prezime4
9 3 Ime9 Prezime5

Kako mogu obrisati duplirane podatke, odnosno podatke koji imaju isti P_ID ali samo da jedan ostane u bazi. U primjeru koji sam naveo trebalo bi da rezultat brisanja bude:

ID P_ID IME PREZIME
-----------------------------------
1 5 Ime1 Prezime1
2 7 Ime2 Prezime2
5 8 Ime5 Prezime5
6 9 Ime6 Prezime2
8 1 Ime8 Prezime4
9 3 Ime9 Prezime5
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
..mtsns-ns.customer.sbb.co.yu.

Jabber: DarkMan


Profil

icon Re: Brisanje dupliciranih podataka23.06.2006. u 13:30 - pre 217 meseci
Code:

if exists(select 1 from sysobjects where name = 'test' and type = 'U')
  drop table test
go
create table test(
ID int not null,
P_ID int not null,
IME varchar(20) not null,
PREZIME varchar(20) not null,
 constraint PK_TEST primary key  (ID)
)
go
insert into test values(1, 5, 'Ime1', 'Prezime1')
insert into test values(2, 7, 'Ime2', 'Prezime2')
insert into test values(3, 5, 'Ime3', 'Prezime3')
insert into test values(4, 5, 'Ime4', 'Prezime4')
insert into test values(5, 8, 'Ime5', 'Prezime5')
insert into test values(6, 9, 'Ime6', 'Prezime2')
insert into test values(7, 7, 'Ime7', 'Prezime3')
insert into test values(8, 1, 'Ime8', 'Prezime4')
insert into test values(9, 3, 'Ime9', 'Prezime5')
go
select * from test
go
select T2.*
from test T1
left join test T2 on T1.P_ID = T2.P_ID and T1.ID <> T2.ID and T1.ID < T2.ID
where T2.ID is not null
go
delete T2
from test T1
left join test T2 on T1.P_ID = T2.P_ID and T1.ID <> T2.ID and T1.ID < T2.ID
where T2.ID is not null
go
select * from test

- prvi select prikazuje koji su trenutni podaci
- drugi prikazuje koji se brisu
- treci prikazuje koji su podaci ostali posle brisanja
 
Odgovor na temu

Shaggy
Miša Simić
Beograd

Član broj: 89502
Poruke: 29
*.maksnet.net.



Profil

icon Re: Brisanje dupliciranih podataka23.06.2006. u 14:07 - pre 217 meseci
DELETE FROM ImeTabele WHERE ID = (SELECT MAX(ID) FROM ImeTabele GROUP BY P_ID HAVING (COUNT(P_ID) > 1)
Misa Simic
MCSD .NET
 
Odgovor na temu

Shaggy
Miša Simić
Beograd

Član broj: 89502
Poruke: 29
*.maksnet.net.



Profil

icon Re: Brisanje dupliciranih podataka23.06.2006. u 14:14 - pre 217 meseci
Citat:
Shaggy: DELETE FROM ImeTabele WHERE ID = (SELECT MAX(ID) FROM ImeTabele GROUP BY P_ID HAVING (COUNT(P_ID) > 1)


Samo sto sam pritisnuo Send - Ugledah gresku. Ispravka:

DELETE FROM ImeTabele WHERE ID NOT IN (SELECT MIN(ID) FROM ImeTabele GROUP BY P_ID HAVING (COUNT(P_ID) >= 1 )


Misa Simic
MCSD .NET
 
Odgovor na temu

SanelD

Član broj: 37995
Poruke: 32
*.rb.a.2-1.247.bih.net.ba.



Profil

icon Re: Brisanje dupliciranih podataka23.06.2006. u 14:22 - pre 217 meseci
Hvala puno! Ja sam jos pronašao ovo rješenje koje je pomoglo

Code:

create table test (
    id int identity(1,1),
    sadrzaj    nvarchar(50)
)

insert into test (sadrzaj) values('tekst 1')
insert into test (sadrzaj) values('tekst 1')
insert into test (sadrzaj) values('tekst 1')
insert into test (sadrzaj) values('tekst 2')
insert into test (sadrzaj) values('tekst 2')
insert into test (sadrzaj) values('tekst 3')
insert into test (sadrzaj) values('tekst 3')
insert into test (sadrzaj) values('tekst 4')





DECLARE @Duplih INT
DECLARE @Tekst    NVARCHAR(50)

DECLARE Brojac CURSOR FOR
SELECT sadrzaj, count(*)-1 as duplih
FROM test
GROUP BY sadrzaj
HAVING count(*) > 1

OPEN Brojac

FETCH NEXT FROM Brojac INTO @Tekst,@Duplih
WHILE @@FETCH_STATUS =0
BEGIN
    SET ROWCOUNT @Duplih
    DELETE FROM Test Where Sadrzaj=@Tekst
    FETCH NEXT FROM Brojac INTO @Tekst,@Duplih
END

CLOSE Brojac
DEALLOCATE Brojac

SET ROWCOUNT 0


 
Odgovor na temu

[es] :: MS SQL :: Brisanje dupliciranih podataka

[ Pregleda: 1644 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.