[ SanelD @ 23.06.2006. 11:26 ] @
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
[ DarkMan @ 23.06.2006. 13:30 ] @
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
[ Shaggy @ 23.06.2006. 14:07 ] @
DELETE FROM ImeTabele WHERE ID = (SELECT MAX(ID) FROM ImeTabele GROUP BY P_ID HAVING (COUNT(P_ID) > 1)
[ Shaggy @ 23.06.2006. 14:14 ] @
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 )

[ SanelD @ 23.06.2006. 14:22 ] @
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