Re: Mehrfacheinträge in Tabelle Korrigieren

From: Andreas Kretschmer <akretschmer(at)spamfence(dot)net>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Mehrfacheinträge in Tabelle Korrigieren
Date: 2011-01-25 19:40:24
Message-ID: 20110125194024.GA12517@tux
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Armin Barth <armin(dot)barth(at)pumpen-barth(dot)de> wrote:

> Hallo,
> in eine Warenwirtschaftsanwendung (lx-office) mit PostgreSQL als
> Datenbank gibt es eine Tabelle 'orderitems' mit folgendem Aufbau
> Tabelle »public.orderitems«
> Spalte | Typ |
> Attribute
> --------------------+-----------------------------+-------------------------------------------------------
> trans_id | integer |
> parts_id | integer |
> description | text |
> qty | real |
> sellprice | numeric(15,5) |
> discount | real |
> project_id | integer |
> reqdate | date |
> ship | real |
> serialnumber | text |
> id | integer | Vorgabewert
> nextval(('orderitemsid'::text)::regclass)
> itime | timestamp without time zone | Vorgabewert now()
> mtime | timestamp without time zone |
> pricegroup_id | integer |
> ordnumber | text |
> transdate | text |
> cusordnumber | text |
> unit | character varying(20) |
> base_qty | real |
> subtotal | boolean | Vorgabewert false
> longdescription | text |
> marge_total | numeric(15,5) |
> marge_percent | numeric(15,5) |
> lastcost | numeric(15,5) |
> price_factor_id | integer |
> price_factor | numeric(15,5) | Vorgabewert 1
> marge_price_factor | numeric(15,5) | Vorgabewert 1
> Indexe:
> "orderitems_id_key" btree (id)
> "orderitems_trans_id_key" btree (trans_id)
> Fremdschlüssel-Constraints:
> "$1" FOREIGN KEY (parts_id) REFERENCES parts(id)
>
> Bei einer anstehenden Programmaktualisierung soll diese u.a. Tabelle
> indexiert werden.
> Die dazugehörige SQL-Anweisung meldet Fehler, mit dem Hinweis, das
> Datensätze doppelt in dieser Tabelle vorhanden sind.
> Meine händische Überprüfung zeigte mir, das Datensätze mehrfach, also 2,
> 3 bis 6 fach auftreten.
> Diese sind in allen Spalten genau gleich, als auch in 'itime' und
> 'mtime'.
> Wie diese entstanden sind ist derzeit nicht nachvollziehbar.
>
> Frage:
> Mit welcher Anweisung kann man diese Tabelle bereinigen, so dass jeder
> Datensatz nur einmal auftaucht?
>
> Ich bitte um eure Unterstützung.

Als erstes solltest Du die Macher der Software kräftig treten.

Zu Deiner Frage:

test=# select * from bla;
a | b | c
---+---+---
1 | 1 | 1
1 | 2 | 3
1 | 2 | 2
1 | 3 | 4
1 | 2 | 3
1 | 1 | 1
(6 Zeilen)

Zeit: 0,165 ms
test=*# select distinct on (a,b,c) ctid, a,b,c from bla;
ctid | a | b | c
-------+---+---+---
(0,1) | 1 | 1 | 1
(0,3) | 1 | 2 | 2
(0,2) | 1 | 2 | 3
(0,4) | 1 | 3 | 4
(4 Zeilen)

Zeit: 0,286 ms
test=*# delete from bla where (ctid, a,b,c) not in (select distinct on
(a,b,c) ctid, a,b,c from bla);
DELETE 2
Zeit: 33,910 ms
test=*# select * from bla;
a | b | c
---+---+---
1 | 1 | 1
1 | 2 | 3
1 | 2 | 2
1 | 3 | 4
(4 Zeilen)

Zeit: 0,220 ms

Andreas
--
Really, I'm not out to destroy Microsoft. That will just be a completely
unintentional side effect. (Linus Torvalds)
"If I was god, I would recompile penguin with --enable-fly." (unknown)
Kaufbach, Saxony, Germany, Europe. N 51.05082°, E 13.56889°

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Andreas 'ads' Scherbaum 2011-01-25 23:16:16 == Wöchentlicher PostgreSQL Newsletter - 23. Januar 2011 ==
Previous Message Armin Barth 2011-01-25 19:15:49 Mehrfacheinträge in Tabelle Korrigieren