Hej Exemplet gjort för SQL Server! Följande fråga plockar ut de värden som skall behandlas: Tack så mycketTa bort dubletter mha SQL
Jag har ett enkelt problem som jag undrar om någon kan hjälpa mig med.
Jag har en tabell av typen (SCHEMATISKT)
ID VÄRDE1 VÄRDE2
1 10 11
1 12 13
2 104 105
3 1006 1007
Nu är det så att jag vill radera alla poster som har samma ID. Jag vill
ha ett unikt ID och bara ett värdepar till det ID-numret. Det spelar ingen
roll i exemplet ovan om ID 1 får värde (10,11) eller (12,13)
Rensa dubletterna helt enkelt, dubletter som ibland kan vara tripletter osv.
Jag har provat exemplet
SELECT * from Tabell
WHERE ID IN
(SELECT ID FROM Tabell GROUP BY ID HAVING COUNT(*) <= 1);
Men det ger mig bara en tabell med de ID-n som är unika och dess värden
inte även ett värde av de som är fler än en sas.
Förstår ni vad jag menar? Tabellen ska ex se ut så här.
ID VÄRDE1 VÄRDE2
1 10 11
2 104 105
3 1006 1007
Tacksam för svar
// DanielSv: Ta bort dubletter mha SQL
Det borde funka ungefär såhär i Access också...
/micke
<code>
create table t
(idcol int not null,
v1 int not null,
v2 int not null)
insert into t values(1,13,15)
insert into t values(1,13,16)
insert into t values(2,23,24)
insert into t values(2,23,24)
insert into t values(3,31,37)
insert into t values(3,33,36)
insert into t values(3,35,36)
insert into t values(4,41,42)
insert into t values(5,53,59)
--Loopa tills alla dubletter är väck
while (select count(*) from
(select idcol from t group by idcol having count(*) > 1) x)
> 0
BEGIN
--Visa vilken rad som kommer raderas nästa gång (kan tas bort)
select top 1 idcol, v1, v2 from
(
select idcol, v1, v2 from t
where idcol in (select idcol from t group by idcol having count(*) > 1)
) temptabell
order by idcol, v1, v2
--Ta bort raden...
--Du måste ha en where/and för varje kolumn, för att inte råka ta bort fler rader.
--Detta funkar bara om inte raderna är helt lika.
--Finns det 2 likadana rader (exakt lika) så kommer båda att tas bort.
--Tyvärr finns inte någon bot mot just det problemet
--Kolla att rad 2 kommer försvinna helt...
delete from t
where idcol = (select top 1 idcol from
(
select idcol, v1, v2 from t
where idcol in (select idcol from t group by idcol having count(*) > 1)
) temptabell1
order by idcol, v1, v2
)
AND v1 =(select top 1 v1 from
(
select idcol, v1, v2 from t
where idcol in (select idcol from t group by idcol having count(*) > 1)
) temptabell1
order by idcol, v1, v2
)
AND v2 =(select top 1 v2 from
(
select idcol, v1, v2 from t
where idcol in (select idcol from t group by idcol having count(*) > 1)
) temptabell1
order by idcol, v1, v2
)
end
--Kontroll på att tabellen är OK.
select * from t
drop table t
</code>Sv: Ta bort dubletter mha SQL
<code>
SELECT Main.*
FROM TabellNamn AS Main
WHERE Main.ID IN (SELECT Sub.ID
FROM TabellNamn AS Sub
GROUP BY Sub.ID
HAVING COUNT(*) > 1);
</code>
Allt hade varit enklare om du oxå haft en unik primär. Du kan ju eventuellt tillfälligt skapa en sådan.
Om du har en unik nyckel tar du bort alla dubletter utan den första med hjälp av följa fråga:
<code>
SELECT Main.*
FROM TabellNamn AS Main
WHERE Main.ID IN (SELECT Sub.ID
FROM TabellNamn AS Sub
GROUP BY Sub.ID
HAVING COUNT(*) > 1) AND NOT Main.UniktID IN (SELECT Min(Sub.UniktID)
FROM TabellNamn AS Sub
GROUP BY Sub.ID);
</code>
Men det går även att göra en distinktion med hjälp av flera fält:
<code>
SELECT Main.*
FROM TabellNamn AS Main
WHERE NOT EXISTS (SELECT Null
FROM (SELECT SubSub.ID, First(SubSub.VÄRDE1) AS VÄRDE1, First(SubSub.VÄRDE2) AS VÄRDE2
FROM TabellNamn AS SubSub
GROUP BY Sub.ID) AS Sub
WHERE Sub.ID=Main.ID AND Sub.VÄRDE1=Main.VÄRDE1 AND Sub.VÄRDE2=Main.VÄRDE2);
</code>Sv: Ta bort dubletter mha SQL
Däremot var jag tvungen att snurra på formen
(samtliga poster - totala antalet unika poster)
Då fick jag till det! Jag hann inte läsa din lösning Andreas
// DJ