Announcement

Collapse
No announcement yet.

Bei doppelten Datensatz einen löschen (mit Bedingung)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bei doppelten Datensatz einen löschen (mit Bedingung)

    Hallo,

    ich habe eine Tabelle der ich drei Primärschlüssel "verpassen" muss. (Spalten: Artikelnummer, Sprache, Mandant)
    Ich muß sie also von doppelten Datensätzen bereinigen.
    "DISTINCT" greift nicht, da die anderen Spalteneinträge unterschiedlich sind.

    Angezeigt bekomme ich die "ungebetenen" Datensätze mit

    Code:
    SELECT     COUNT(Artikelnummer) AS Expr1, Artikelnummer, Sprache, Mandant
    FROM         KHKArtikelBezeichnung2
    GROUP BY Artikelnummer, Sprache
    HAVING      (COUNT(Artikelnummer) > 1)
    Im Moment lösche ich von Hand. Meine Versuche dies automatisch zu machen sind leider gescheitert:

    Code:
    DELETE FROM [TempTabelle]
    WHERE Artikelnummer = 
    (
           SELECT Artikelnummer
           FROM 
                     (
                      SELECT     COUNT(Artikelnummer) AS Expr1, Artikelnummer,  Sprache, Mandant
                       FROM         KHKArtikelBezeichnung2
                       GROUP BY Artikelnummer, Sprache
                       HAVING      (COUNT(Artikelnummer)
                      )
    )
    
    AND Bezeichnung1 IS NULL
    Geht das überhaupt?

    Mit Dank und Gruß
    Markus Blick

  • #2
    Hallo Markus,
    Originally posted by EspelTel View Post
    ...ich habe eine Tabelle der ich drei Primärschlüssel "verpassen" muss. (Spalten: Artikelnummer, Sprache, Mandant)
    Ich muß sie also von doppelten Datensätzen bereinigen.
    Eine Tabelle kann nur EINEN Primärschlüssel haben. Du meinst also sicherlich das du UNIQUE-Constraints anlegen möchtest.

    Originally posted by EspelTel View Post
    ...Angezeigt bekomme ich die "ungebetenen" Datensätze mit

    Code:
    SELECT     COUNT(Artikelnummer) AS Expr1, Artikelnummer, Sprache, Mandant
    FROM         KHKArtikelBezeichnung2
    GROUP BY Artikelnummer, Sprache
    HAVING      (COUNT(Artikelnummer) > 1)
    Das ist nicht ganz korrekt! Im GROUP BY MÜSSEN alle Spalten aus dem Select-Teil aufgeführt werden die keine Aggregatfunktionen sind!

    ...GROUP BY Artikelnummer, Sprache, Mandant...

    Originally posted by EspelTel View Post
    ...
    Im Moment lösche ich von Hand. Meine Versuche dies automatisch zu machen sind leider gescheitert:

    Code:
    DELETE FROM [TempTabelle]
    WHERE Artikelnummer = 
    (
           SELECT Artikelnummer
           FROM 
                     (
                      SELECT     COUNT(Artikelnummer) AS Expr1, Artikelnummer,  Sprache, Mandant
                       FROM         KHKArtikelBezeichnung2
                       GROUP BY Artikelnummer, Sprache
                       HAVING      (COUNT(Artikelnummer)
                      )
    )
    
    AND Bezeichnung1 IS NULL
    Geht das überhaupt?
    Damit dürftest du dir immer alle Datensätze löschen (mal abgesehen von den Syntaxfehlern). Aber der Ansatz ist richtig, du benötigst jedoch noch ein zusätzliches Kriterium für den DS der NICHT gelöscht werden soll. Das könnte z.B. ein min(pk) bzw. max(pk) sein.
    Bemüh mal die Suche zum Thema "Doppelte Datensätze löschen", da solltest du genügend Lösungsmöglichkeiten finden.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Markus,

      mehr aus Neugierde:
      KHKArtikelBezeichnung2
      Also die Sage Office Line oder Classic Line, gelle?

      Ist aber keine der Standard-Tabellen, oder?

      Bist Du Dir sicher, das Du doppelte Einträge hast? Sage ist den Mehr-Mandantenfähig (Feld "Mandant") und die Tabellen haben (im Standard) einen PK, so das man keine doppelten Datensätze bekommen kann.
      Olaf Helper

      <Blog> <Xing>
      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

      Comment


      • #4
        Originally posted by O. Helper View Post
        ...und die Tabellen haben (im Standard) einen PK, so das man keine doppelten Datensätze bekommen kann.
        Sorry wenn ich hier auf den Namen rumreite, aber ein PK ist nicht dafür da doppelte Datensätze zu verhindern! Ein PK ist dafür da einen DS eindeutig zu identifizieren. Das ist ein Unterschied! Ein "doppelter Datensatz" bedarf immer einer bestimmten Regel. Es gibt durchaus Tabellen, die einen PK haben und trotzdem - nach irgendeiner Regel - doppelte DS beinhalten.
        Für die Durchsetzung von Regeln zur Verhinderung von Doppeldeutigkeit gibt es UNIQUE-CONSTRAINTS!

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hallo Olaf

          Originally posted by O. Helper View Post
          Hallo Markus,

          mehr aus Neugierde:

          Also die Sage Office Line oder Classic Line, gelle?

          Ist aber keine der Standard-Tabellen, oder?

          Bist Du Dir sicher, das Du doppelte Einträge hast? Sage ist den Mehr-Mandantenfähig (Feld "Mandant") und die Tabellen haben (im Standard) einen PK, so das man keine doppelten Datensätze bekommen kann.
          Ja, es ist die OfficeLine.

          Diese "KHKArtikelBezeichnung" verwaltet die Mehrsprachigkeit. Eine ausgewählte Anzahl an Artikeln wurde zu einer Übersetzerin geschickt (als Access 97) nun wurden aber leider einige Zeilen doppelt gespeichert.

          Comment


          • #6
            Danke für die Anregungen!

            Du hast recht Falk, ich meinte UNIQUE-CONSTRAINTS . Ich habe das noch als "zusammengesetzte Primärschlüssel" gelehrt.

            Wenn ich nochmal vor solch einer Aufgabe stehe, versuche ich es! Und melde mich hier wieder. Im Moment fehlt leider die Zeit zum ausprobieren. :-(

            Nochmal Danke!
            Gruß
            Markus

            Comment


            • #7
              Hallo Markus,

              beruhigt mich ja, das ich nicht der einzige hier bin, der sich mit der OL herumschlagen darf ;-).

              Wenn Du die "KHKArtikelBezeichnung2" identisch wie die Original-Tabelle angelegt hats, hast Du eine Chance und zwar über das Timestamp Feld.

              Das hier sollte Dir von den doppelt Datensätzen jeweils das älteste liefern.

              [highlight=SQL]SELECT *
              FROM KHKArtikelBezeichnung2
              WHERE [TimeStamp] IN
              (SELECT MIN([Timestamp])
              FROM KHKArtikelBezeichnung2
              GROUP BY Mandant, Artikelnummer, Sprache
              HAVING COUNT(*) > 1)[/highlight]

              Wenn ja, SELECT * durch DELETE ersetzten. Wenn nicht nur doppelt sonder auch dreifache vorhanden sind, einfach mehrfach ausführen; der jüngste überlebt.
              Olaf Helper

              <Blog> <Xing>
              * cogito ergo sum * errare humanum est * quote erat demonstrandum *
              Wenn ich denke, ist das ein Fehler und das beweise ich täglich

              Comment


              • #8
                Hallo Falk,

                aber ein PK ist nicht dafür da doppelte Datensätze zu verhindern
                grundsätzlich und in der Theorie hast Du vollkommen Recht.

                Zufällig weiß ich aber, das hier das DBMS der MS SQL Server ist (habe hier die gleiche ERP im Einsatz) und beim dem ist es halt so, das für einen PK automatisch und ungefragt ein UNIQUE INDEX auf die Felder des PKs angelegt wird; das kann man auch nicht verhinden, das ist halt so.
                Deswegen trifft das in diesem Falle schon zu; halt aber eben nur in diesem Fall & unter diesen Umständen.

                @Markus; hat es geklappt?
                Olaf Helper

                <Blog> <Xing>
                * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                Comment


                • #9
                  Hallo Olaf,

                  auch für mich ist es tröstlich , dass auch andere sich duch die 625 Tabellen "wurschteln" müssen.

                  Mit Timestamps z.B habe ich bis jetzt noch gar nicht gearbeitet. (Danke für den Tip.) Und zur Zeit sitzte ich an einer Replication der OfficeLine-Datenbank auf einen separaten Server. Dort wird sie mit einer Bestehend verknüpft und über .NET Anwendungen gepflegt und angezeigt.

                  Wie wäre ein eigener Thread / Untergruppe zum Thema OfficeLine-SQL?

                  Gruß
                  Markus

                  Comment

                  Working...
                  X