Ankündigung

Einklappen
Keine Ankündigung bisher.

Gleiche Zeilen bis auf eine löschen?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Gleiche Zeilen bis auf eine löschen?

    Hi,

    mit folgender Abfrage versuche ich, Datenbankzeilen, in denen der Benutzername '$escname' der selbe ist, bis auf eine solche Zeile zu löschen (NAMES.ID ist unique):

    Code:
    DELETE FROM NAMES
    USING NAMES, NAMES as vtable
    WHERE NAMES.AuthorID = $destid AND NAMES.Name = '$escname'
    AND (NOT NAMES.ID=vtable.ID)
    AND (NAMES.Name=vtable.Name)
    Es geht nicht. Es verschwinden immer alle Namen von denen, die es mehr als einmal gibt. Was tun?

    danke,
    Ags

  • #2
    Warum schreibst Du die Datensätze denn erst doppelt rein?

    Kommentar


    • #3
      Mach ich garnicht, meine Aufgabe besteht darin, eine Datenbank zu bereinigen.

      Kommentar


      • #4
        Zitat von ags Beitrag anzeigen
        Mach ich garnicht, meine Aufgabe besteht darin, eine Datenbank zu bereinigen.
        Dann mach es. Zum Beispiel so:

        Code:
        test=# select * from ags;
         name
        -------
         peter
         hans
         hans
         peter
         ags
         peter
         ags
         hans
        (8 rows)
        
        Time: 0,223 ms
        test=*# delete from ags where (ctid, name) not in (select max(ctid), name from ags group by name);
        DELETE 5
        Time: 72,218 ms
        test=*# select * from ags;
         name
        -------
         peter
         ags
         hans
        (3 rows)
        Andreas

        Kommentar


        • #5
          Hi,

          Bsp.

          PHP-Code:
          DELETE FROM Tabelle WHERE ID NOT IN (SELECT MIN(IDFROM Tabelle GROUP BY Wert1,Wert2
          mfg Wolf29

          Kommentar


          • #6
            Das hier:

            Code:
            DELETE FROM NAMES
            WHERE AuthorID = $destid AND Name LIKE '$escname'
            AND ID NOT IN (SELECT MIN(ID) FROM NAMES
            WHERE AuthorID = $destid AND Name LIKE '$escname')
            Ergibt das:

            Code:
            You can't specify target table 'NAMES' for update in FROM clause
            Und den Grund für das GROUP BY, den kann ich noch nich sehen.

            Kommentar


            • #7
              Zitat von akretschmer Beitrag anzeigen
              Dann mach es. Zum Beispiel so:

              Andreas

              Ich vergaß zu erwähnen:
              • based on PostgreSQL, aber der Fragesteller nannte keine DB
              • funktioniert dafür aber für Tabellen, die wirklich nur identische Spalten haben, eine oder beliebig viel, und kein Unterscheidungsmerkmal wie einen PK oder so.


              Der *Trick* ist ein automatisch vom System mitgeführter interner Key, ctid.

              Andreas

              Kommentar


              • #8
                Versuchs mal damit:
                Code:
                DELETE FROM NAMES
                WHERE AuthorID IN (".implode(",",$sourceids).",$destid) AND Name LIKE '$escname'
                AND ID NOT IN (SELECT id FROM (SELECT MIN(ID) AS id FROM NAMES
                WHERE AuthorID IN (".implode(",",$sourceids).",$destid) AND Name LIKE '$escname'))

                Kommentar


                • #9
                  Zitat von ags Beitrag anzeigen
                  Mach ich garnicht, meine Aufgabe besteht darin, eine Datenbank zu bereinigen.
                  Mach ein select distinct in eine neue Tabelle, wirf die alte weg und benenne die neue in die alte um.

                  Andreas

                  Kommentar


                  • #10
                    Mach ich garnicht, meine Aufgabe besteht darin, eine Datenbank zu bereinigen.
                    Und was heißt das jetzt? Einmalig? Dann kopier doch einfach die Daten in eine zweite Tabelle und benutze DISTINCT.

                    Kommentar


                    • #11
                      tkausl:

                      bringt dieses:
                      Code:
                      Every derived table must have its own alias

                      Kommentar


                      • #12
                        Zitat von ags Beitrag anzeigen
                        tkausl:

                        bringt dieses:
                        Code:
                        Every derived table must have its own alias
                        dann pack nen alias hinten dran...

                        Code:
                        DELETE FROM NAMES
                        WHERE AuthorID IN (".implode(",",$sourceids).",$destid) AND Name LIKE '$escname'
                        AND ID NOT IN (SELECT id FROM (SELECT MIN(names2.ID) AS id FROM NAMES AS names2
                        WHERE AuthorID IN (".implode(",",$sourceids).",$destid) AND Name LIKE '$escname') as names3)

                        Kommentar


                        • #13
                          Nikosch: die Bereinigung geht nicht als 1 Durchlauf, sondern man muß in einem Migrationsprozess über längere Zeit hinweg per Hand und Auge rumsortieren und Personen zusammen führen, die verschiedene oder auch gleiche Namen haben können. Ich glaube ich hatte das schonmal a.a.S. erklärt.

                          Kommentar


                          • #14
                            Und? Ändert doch nichts an der Aussage.

                            Kommentar


                            • #15
                              tkausl: das hat mir jetzt alle Namen der Zielperson gelöscht.

                              Kommentar

                              Lädt...
                              X