*Markus: Alle Einträge mit count(id) > 1 löschen?

Hallo,

ich habe folgende Tabelle:

id |    name    | age |   gebdat
----+------------+-----+------------
  1 | Huber      |  37 | 1971-10-10
  2 | Mustermann |  15 | 1994-12-01
  3 | Hofer      |  45 | 1966-10-10
  3 | Moser      |  44 | 1966-10-10
  5 | Hauser     |  30 | 1978-10-10
  6 | Musterfrau |  44 | 1966-10-10
  7 | Hauser     |  31 | 1979-10-10
 10 | Burger     |  25 | 1983-04-09

Jetzt will ich daraus alle Einträge so löschen, dass jene ID nur einmal vorkommt. Da 3 zwei Mal vorkommt, soll einer der beiden 3er verschwinden.
Das Statement soll natürlich allgemein gehalten sein.

Ich stelle mir etwas in diese Richtung vor:

delete from tempperson where count(id) > 1;

Führt aber leider zu einem...
aggregates not allowed in WHERE clause

in PostgreSQL.
Wie kann ich an das Problem herangehen?

Markus

--
  1. yo,

    in PostgreSQL.
    Wie kann ich an das Problem herangehen?

    du machst dir das leben sehr einfach, wenn du noch eine zuästzliche spalte hinzufügtst, wo du einen eindeutigen bezeichner generierst (einfach nur die datensätze hochzählen). dann kannst du die mit gleicher id auch eindeutig unterscheiden, welchen du behalten willst und welche löschen, zum beispiel indem du bei gleicher id, die löscht, die in der generierten spalte einen wert größer als den MIN-wert der spalte haben.

    Ilja

    1. Hallo,

      das mit der rowid ist ein guter Ansatz. Ich verstehe zwar jetzt nicht ganz, wie mir diese beim Löschen helfen kann, aber vielleicht finde ich es noch heraus.

      Markus

      --
      1. yo,

        Ich verstehe zwar jetzt nicht ganz, wie mir diese beim Löschen helfen kann, aber vielleicht finde ich es noch heraus.

        mit einer korrelierten unterabfrage. wenn du die anzeigen wilst, die du löschen willst dann so:

        SELECT t1.generierte_spalte, t1.id
        FROM tabelle t1
        WHERE t1.generierte_spalte <> (SELECT MIN(t2.generierte_spalte)
                                       FROM tabelle t2
                                       WHERE t2.id = t1.id
                                      )
        ;

        falls du dich anzeigen willst, die du behalten willst, dann mach aus dem '<>' ein '=' Zeichen

        Ilja

        1. Hallo,

          danke so klappt es. Damit kann ich die Daten aus der Temp-Tabelle wieder in die Orginaltabelle kopieren und habe die richtigen Datensätze.

          Markus

          --
          1. danke so klappt es. Damit kann ich die Daten aus der Temp-Tabelle wieder in die Orginaltabelle kopieren und habe die richtigen Datensätze.

            fürs anmerkheft: wenn ein feld in einer datenbank id heisst muss es nicht unbedingt eindeutig sein (rein technisch gesehen), ein id-feld zu haben, welches einen nicht eindeutigen wert enthält, ist aber schon fast pervers ;)