Von doppelten Einträgen einen löschen

gurbelunder

SQL-Guru
Beiträge
136
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.830
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.

David


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

SQL-Guru
Beiträge
136
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?
 

akretschmer

Datenbank-Guru
Beiträge
9.830
Danke dir für deine schnelle Antwort. Umgemünzt auf MySQL:


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
SQL-Fehler: You can't specify target table 'AccountingPrimary' for update in FROM clause
SQL-Fehler: Operand should contain 1 column(s)


Was sagt ihr?

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

Meine Antwort: MySQL nicht nutzen.


Andreas
 

gurbelunder

SQL-Guru
Beiträge
136
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.
 

akretschmer

Datenbank-Guru
Beiträge
9.830
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.

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 ...
 
Werbung:

gurbelunder

SQL-Guru
Beiträge
136
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!!!
 
Oben