Re: Schnelles Auffinden doppelter Daten

Tech-Archive recommends: Fix windows errors by optimizing your registry



Hallo Henning,


Alternativ, ebenfalls SQL:

select * from tabelle1 where VAL in (select val from tabelle1 group by
val having count(val)>1);

Also, damit bekommst du dann alle doppelten Daten angezeigt - aber wenn
du dann einfach alle in dieser Abfrage angezeigten Daten löschst, dann
hast du keine der Zeilen mehr. Also wenn du drei Datensätze mit val=3
hast, dann werden alle drei angezeigt - und ggf. auch gelöscht. Das ist
aber ja nicht der Plan.

Selektiert erst einmal alle Zeile aus der Meneg heraus, deren Wert mehr
als einmal in der Tabelle vorkommt. Dann muß man nur noch mit dieser
Teilmenge weiterarbeiten...

Tja, aber wie machst du das denn? Machst du das manuell? Also gehst du
die Tabelle durch und löschst die Zeilen? Bei 20 Zeilen geht das ja
vielleicht noch, aber bei 10.000 Zeilen kann das schon mal länger dauern
(besser vorher mit genug Snickers eindecken).

Die Zeile
INSERT INTO #arbeitstabelle SELECT DISTINCT Kennung FROM tabelle
funktioniert nur, wenn die 'tabelle' wirklich nur eine Spalte hat, aber
nicht, wenn 'Kennung' den PK darstellt und der Wert in einer anderen
Spalte sitzt.

In einem anderen Posting hatte Rene gesagt, dass die Tabelle nur eine
Spalte hat - genau diese GUID Spalte :)

Wenn es mehr als eine Spalte gibt, dann muss das natürlich etwas anders
aussehen. Wenn man davon ausgeht, dass alle Spalten identisch sind und
es doppelte Zeilen gibt dann müsste das so gehen:

--- cut ---
BEGIN TRAN

CREATE TABLE #arbeitstabelle (key uniqueidentifier, val varchar(50))
INSERT INTO #arbeitstabelle SELECT DISTINCT key, val FROM tabelle
DELETE tabelle
INSERT INTO tabelle SELECT key, val FROM #arbeitstabelle
DROP TABLE #arbeitstabelle

und es würde auch so gehen:
SELECT DISTINCT * INTO #arbeitstabelle FROM table
DELETE table
INSERT INTO table SELECT * FROM #arbeitstabelle
DROP TABLE #arbeitstabelle
....dann brauchst du dir über Datentypen keine Gedanken zu machen.


COMMIT TRAN
--- cut ---

Gibt es doppelte Zeilen, in denen nur das val doppelt ist, die aber über
keinen doppelten key verfügen (weil der per newid() angelegt wurde)
könnte das so gehen:

--- cut ---
BEGIN TRAN

CREATE TABLE #arbeitstabelle (key uniqueidentifier, val varchar(50))

INSERT INTO #arbeitstabelle

SELECT key, val FROM tabelle WHERE key IN (SELECT Min(key) FROM tabelle
GROUP BY val HAVING Count(val)>1)

Das würde nur bei numerischen keys gehen und nicht bei guid's/uniqueidentifier... und es würde eh daneben gehen, denn du hättest in der arbeitstabelle nur die Datensätze die in deinem Select doppelt (HAVING Count(val)>1)) waren... alle anderen wären flöten gegangen ;-)


DELETE tabelle
INSERT INTO tabelle SELECT key, val FROM #arbeitstabelle
DROP TABLE #arbeitstabelle


COMMIT TRAN
--- cut ---

Abgesehen davon liegt ihr beide daneben, denn die Daten stammen nicht aus tables sondern von unterschiedlichen services und sind in einem DataTable enthalten ;-).

Gruß Carl

.



Relevant Pages

  • Re: Abfrage bei Sybase SQL Anywhere 9
    ... SELECT ArtikelNr FROM Tabelle ... EXCEPT SELECT ArtikelNr FROM Tabelle WHERE Datum> '2008-02-01' ...
    (de.comp.datenbanken.misc)
  • Re: union
    ... select Code as Wert, Bemerkung as Bemerkung from MeineAbfrage ... Scan table 'Tabelle'" ...
    (microsoft.public.de.access)
  • Re: Gewisse Zeilenwerte addieren
    ... > FROM Tabelle ... > UNION ALL SELECT Tabelle.IDLoser as ID,> Tabelle.ScoreLoser as Score, ... > auf Basis dieser eine Abfrage zur Berechnung der> Summen: ...
    (microsoft.public.de.access)
  • Re: FAQ 3.16 mit spezieller einschraenkung der Datumsrange in der A-Tabelle
    ... den in Tabelle B gegebenen Datumsrange eingegrenzt sein, ... SELECT A.* ... FROM A LEFT JOIN B ON A.ID=B.ID ... AND A.DATUM BETWEEN MINAND MAX; ...
    (microsoft.public.de.access)
  • Re: Unterabfrage in SP
    ... FROM dbo.tbl_material inner join ... Wie kann ich einen Multiplikator aus einer anderen Tabelle angeben? ... Select ZuÄnderndesFeld, NeuerWertWieAuchImmerBerechnet ...
    (microsoft.public.de.access)