1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Von doppelten Einträgen einen löschen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von gurbelunder, 14 Mai 2013.

  1. gurbelunder

    gurbelunder Datenbank-Guru

    Hallo zusammen,

    ich habe unter MySQL folgende Tabelle:

    Code:
    mysql> describe AccountingPrimary;
    +-------------------------------+------------------+------+-----+---------+----------------+
    | Field                        | Type            | Null | Key | Default | Extra          |
    +-------------------------------+------------------+------+-----+---------+----------------+
    | JobID                        | varchar(16)      | YES  |    | NULL    |                |
    | Status                        | char(2)          | YES  | MUL | NULL    |                |
    | Year                          | varchar(4)      | YES  | MUL | NULL    |                |
    | Month                        | char(2)          | YES  |    | NULL    |                |
    | Day                          | char(2)          | YES  |    | NULL    |                |
    | Sender                        | varchar(16)      | YES  | MUL | NULL    |                |
    | ObjectClass                  | varchar(16)      | YES  | MUL | NULL    |                |
    | Receiver                      | varchar(16)      | YES  | MUL | NULL    |                |
    | JobName                      | varchar(16)      | YES  | MUL | NULL    |                |
    | ProcessingTimeComplete        | varchar(16)      | YES  |    | NULL    |                |
    | ExecutionTimeOfAll            | varchar(16)      | YES  |    | NULL    |                |
    | NoOfAllExecutedFunctionCalls  | varchar(16)      | YES  |    | NULL    |                |
    | NoOfAllIncorrectFunctionCalls | varchar(16)      | YES  |    | NULL    |                |
    | ObjectID                      | varchar(16)      | YES  |    | NULL    |                |
    | NoOfComponents                | varchar(16)      | YES  |    | NULL    |                |
    | AccumulatedCompSize          | varchar(16)      | YES  |    | NULL    |                |
    | SizeOfEachComp                | varchar(128)    | YES  |    | NULL    |                |
    | YearMonth                    | varchar(6)      | YES  | MUL | NULL    |                |
    | RecNR                        | int(10) unsigned |      | PRI | NULL    | auto_increment |
    +-------------------------------+------------------+------+-----+---------+----------------+
    19 rows in set (0.00 sec)
     
    mysql>
    
    Innerhalb dieser Tabelle kommen Datensätze doppelt vor. Dies habe ich an der ersten Spalte, der JobID festgestellt durch:
    Code:
    select JobID, Count(JobID)
    from AccountingPrimary
    where YearMonth > '201212'
    Group By JobID
    Having count(JobID) >1;
    
    Wie man sieht, interessieren mich erstmal nur die Einträge aus diesem Jahr. Das einzige, was sich unterscheidet, ist die RecNr, da die autoincrement ist.
    Nun möchte ich von den doppelten Datensätzen alle die löschen, bei denen die RecNr kleiner ist als die des anderen Datensatzes. Beispiel dazu:
    Zwei Datensätze haben beide die JobID 123456 und auch der Rest ist gleich bis auf die RecNr, der eine hat die 1 und der andere die 2. Ich möchte nun den Datensatz mit RecNr=1 löschen und den Datensatz mit RecNr=2 behalten.
    Ich denke die ganze Zeit an Joins, aber da hab ich im Studium wohl Kreide geholt... ;-)
    Habt ihr eine gute Idee?
    Danke euch und Grüße,
    David
     
  2. akretschmer

    akretschmer Datenbank-Guru


    In PostgreSQL:

    Code:
    test=# select * from foo;
     jobid  | recnr | context
    --------+-------+---------
     123456 |     1 | bla
     123456 |     2 | bla
     123457 |     1 | bla
     123458 |     1 | bla
    (4 rows)
    
    test=*# select jobid, min(recnr) from foo group by jobid having count(*) > 1;
     jobid  | min
    --------+-----
     123456 |   1
    (1 row)
    
    test=*# delete from foo where (jobid,recnr) in (select jobid, min(recnr) from foo group by jobid having count(*) > 1);
    DELETE 1
    test=*# select * from foo;
     jobid  | recnr | context
    --------+-------+---------
     123456 |     2 | bla
     123457 |     1 | bla
     123458 |     1 | bla
    (3 rows)
    
    Ob das in MySQL geht weiß ich aber nicht.
     
    gurbelunder gefällt das.
  3. gurbelunder

    gurbelunder Datenbank-Guru

    Danke dir für deine schnelle Antwort. Umgemünzt auf MySQL:

    Das hier hat wunderbar geklappt:
    Code:
    select JobID, min(RecNr) from AccountingPrimary where YearMonth > '201212' group by JobID having count(JobID) > 1;
    
    Aber das Löschen gibt Fehler. Hier die dreiVarianten mit ihren Meldungen:
    1. Variante
    Code:
    delete from AccountingPrimary where JobID, RecNr in
    (
      select JobID, min(RecNr) from AccountingPrimary where YearMonth > '201212' group by JobID having count(JobID) > 1
    );
    SQL-Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' RecNr in
    
    2. Variante
    Code:
    delete from AccountingPrimary where (JobID, RecNr) in
    (
      select JobID, min(RecNr) from AccountingPrimary where YearMonth > '201212' group by JobID having count(JobID) > 1
    );
    SQL-Fehler: You can't specify target table 'AccountingPrimary' for update in FROM clause
    
    Ich will doch gar kein Update machen???
    3. Variante
    Code:
    delete from AccountingPrimary where RecNr in
    (
      select JobID, min(RecNr) from AccountingPrimary where YearMonth > '201212' group by JobID having count(JobID) > 1
    );
     
    SQL-Fehler: Operand should contain 1 column(s)
    
    Was sagt ihr?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Selbes Problem wie hier: http://www.datenbankforum.com/threads/einträge-mit-doppeltem-inhalt-finden-und-updaten.1166/

    Meine Antwort: MySQL nicht nutzen.


    Andreas
     
    gurbelunder gefällt das.
  5. gurbelunder

    gurbelunder Datenbank-Guru

    Naja, in dem Moment bin ich an MySQL gebunden. Designt habe ich den Blödsinn nicht, denn, seien wir mal erlich, einige Felder sind wirklich Grütze. Ich soll mich um den Umzug der Tabelle kümmern, diesmal aber in Richtung Oracle. Vorher wollten wir die Datensätze etwas bereinigen, dementsprechend meine Frage ;).

    Ich schau mir den Link gleich mal an.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ich sehe es erst jetzt:

    Code:
    | Year                          | varchar(4)      | YES  | MUL | NULL    |                |
    | Month                        | char(2)          | YES  |    | NULL    |                |
    | Day                          | char(2)          | YES  |    | NULL    |                |
     
    
    ist ja furchbar ...
     
    gurbelunder gefällt das.
  7. gurbelunder

    gurbelunder Datenbank-Guru

    akretschmer gefällt das.
  8. gurbelunder

    gurbelunder Datenbank-Guru

    So, ich habe das auf einem anderen Weg gelöst bekommen. Die Daten aus der MySQL Tabelle sollen in eine neue Oracle Datenbank. Ich habe die Daten nun doppelt nach Oracle übertragen und dort die doppelten Einträge gelöscht. Dort hat der Befehl wunderbar funktioniert.

    Vielen lieben Dank für deine Hilfe!!!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden