Announcement

Collapse
No announcement yet.

Duplikate entfernen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Duplikate entfernen?

    Hallo,

    ich habe folgendes Problem. Ich habe vor längerer Zeit mal eine Tabelle in einer mySQL-DB angelegt, jedoch vergessen den Primärschlüssel zu definieren. Nun habe ich einige Duplikate in der DB. Ich würde nun gerne die Duplikate löschen. Kann ich dies über ein SQL Statement machen? Welches?

    Die Tabelle heißt: "olt" und das Feld welches der Primärschlüssel sein sollte heißt "itemID" Sind zwei Einträge mit der gleichen itemID enthalten kann eines (egal welches) definitiv gelöscht werden.

    Wäre für Hilfe dankbar.

  • #2
    Hallo,

    wenn du das in einem SQL-Statement machen möchtest, dann brauchst du in jedem Fall irgendein Feld in dem sich die DS unterscheiden. Ansonsten kannst du mit SQL nicht definieren welchen DS er behalten soll.
    Auch wird es in MySQL schwierig, um nicht zu sagen unmöglich, dies in "einem Rutsch" zu tun, da MySQL keinen Select-Zugriff auf eine gerade geänderte Tabelle gestattet.

    Mein Vorschlag wäre deshalb:
    1. Tabelle umbenennen
    [highlight=sql]
    RENAME TABLE olt TO old_olt;
    [/highlight]
    2. Die Tabelle olt mit der richtigen Struktur neu anlegen.
    3. Die "eindeutigen" DS aus old_olt wieder in olt einfügen.
    [highlight=sql]
    insert into olt (
    select itemID, ...
    from old_olt a
    where a.das_unterscheidungs_feld = (
    select min(b.das_unterscheidungs_feld)
    from old_olt b
    where b.itemID = a.itemID
    )
    )
    [/highlight]

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Auch hallo,

      man könnte mehrfach vorhandene Datensätze durchnummerieren, wie z.B in diesem Beispiel mit SQL Server: http://devtechblog.blogspot.com/2009...-tabellen.html
      (inwieweit das aber auf MySQL übertragbar ist....)
      MfG
      Cheat-Sheets for Developers / Programming Quotes

      Comment


      • #4
        Originally posted by Markus Lahr View Post
        ...(inwieweit das aber auf MySQL übertragbar ist....)
        Sowas wie ROW_NUMBER gibt es in MySQL nicht (hab ich schon oft genug vermisst).

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          jedoch vergessen den Primärschlüssel zu definieren.
          Dann ist dein PK Feld aber evtl. auch falsch gewählt, denn ein PK sollte rein technisch sein und keinen Zusammenhang mit fachlichen Daten besitzen. Sprich wenn dein PK doppelt ist, sollte man nicht auch darauf schließen können, dass die komplette Zeile identisch ist.

          Dim
          Zitat Tom Kyte:
          I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

          Comment


          • #6
            Wieviele Werte sind es denn?

            Bei wenigen(<1000) einfach sortieren lassen und Duplikate per Hand entfernen.

            Comment


            • #7
              So könnte es gehen:
              Das folgende ist ein Testcode, bitte aufpassen, es werden zwei Tabellen test und test2 gelöscht.

              connect test;
              drop table test;
              drop table test2;
              create table test(name varchar(10),vorname varchar(10));
              insert into test values('mueller','hans');
              insert into test values('mueller','hans');
              insert into test values('mueller','hans');
              insert into test values('tischler','hans');
              insert into test values('tischler','hans');
              insert into test values('mueller','hans');
              insert into test values('mueller','mueller');
              insert into test values('mueller','tischler');
              insert into test values('mueller','hans');
              alter table test add column(id int primary key auto_increment);
              select * from test;
              create table test2(select * from test);
              select * from test2;
              alter table test2 add column (off int);
              update test,test2 set off=1 where test.name=test2.name and test.vorname=test2.vorname and test.id<test2.id;
              delete from test2 where off=1;
              select * from test2;
              Zuletzt editiert von mtth; 26.10.2009, 11:51.

              Comment


              • #8
                Danke,

                komme leider erst jetzt dazu mich der Thematik wieder zu widmen. Werde nächste Woche berichten ob es funktioniert.

                Comment

                Working...
                X