reimer: doppelte einträge finden

Wie finde ich mit Standard-SQL (incl subqueries) *nur* die Datensätze in einer Tabelle die mindestens doppelt vorkommen (bzw. sogar mehrfach)? Das sollte doch eigentlich möglich sein, ich sehe aber einfach nicht wie.

Gruss
Reimer

  1. Hallo,

    SELECT MAX(eintrag), COUNT(eintrag) FROM tabelle GROUP BY eintrag

    Gruß Frank

    1. SELECT MAX(eintrag), COUNT(eintrag) FROM tabelle GROUP BY eintrag

      Prima Lösung. Da muss ich mal verstärkt max,count und group nachlesen und verstehen.
      Kann ich das ganze auch auf den (für mich) nichttrivialFall zweier Tabellen anwenden?

      tab1
      id01 nr01

      tab2
      id01 tx01

      Die "Tabelle" der nr01-Doppelwerte entsteht aus:
      in Worten:
       Suche unique nr01/tx01-Tupel
      SQL:
       select *distinct* t.nr01, tt.tx01 from tab1 t, tab2 tt where t.id01=tt.id01

      Vielen Dank
      Reimer

      1. Hallo Reimer

        Suche unique nr01/tx01-Tupel

        ??? Kannst Du mir das so erklären, daß ich das auch verstehe. Sorry, geht auf's Wochenende zu.

        Gruß Frank

        1. Hallo Reimer

          Suche unique nr01/tx01-Tupel
          ??? Kannst Du mir das so erklären, daß ich das auch verstehe.

          Hast ja recht, íst so nicht zu verstehen. Vielleicht wird es so deutlicher:

          tab1 <= tabellenname
          id01 nr01 <=tabellenspaltennamen
          a  01 <= spalteninhalte
          b  01
          c  02
          d  05
          e  02

          tab2
          id01 tx01
          a  tx01
          b  tx02
          c  tx02
          d  tx05
          e  tx02

          Es geht darum die durch einen Equijoin über id01 entstehenden Paarungen nr01/tx01 auf Doppel in nr01 abzuprüfen.

          select *distinct* t.nr01, tt.tx01 from tab1 t, tab2 tt where t.id01=tt.id01
          =>
          01  tx01
          01  tx02
          02  tx02
          05  tx05

          => "01" ist doppelt belegt. Diese "Doppel" möchte ich aus ca 1000recs tiefen Tabellen herausfiltern

          Vielen Dank für deine Geduld und ein schönes Wochenende

          Reimer

  2. hi Reimer

    vileicht etwas in der richtung?

    select name,vorname from adressen where ID in
    (
    select O.ID from adressen O inner join adressen I on I.name=O.name and I.vorname=O.vorname and I.ID < O.ID
    )

    könnte funktionieren ;)

    so long
    ole
    (8-)>

  3. Hallo,

    Wie finde ich mit Standard-SQL (incl subqueries) *nur* die Datensätze in einer Tabelle die mindestens doppelt vorkommen (bzw. sogar mehrfach)?

    Zuerst solltest Du Dir im klaren sein, _wie_ der begriff 'doppelte Datensätze' definiert ist. Ist er nur dann doppelt, wenn alle Felder (außer das, hoffentlich vorhandene, ID-Feld) identisch befüllt sind, oder nur einige dieser Felder, oder ist es auch ein doppelter Datensatz, wenn bei zwei Datensätzen ein oder mehrere Felder fast gleich bzw ähnlich sind (Ich denke da an Gorß-Kleinschreibung und z.B. eine Telefon-Nummer, die einmal '+498154711' und ein anderes mal '0049 815 4711' geschrieben ist).

    Erst wenn diese Vorgaben genau definiert sind, kannst Du Dich wirklich auf die Suche begeben. Dafür, glaube ich, sind ein 'Group by' in Verbindung mit der Funktion Count() die passenden Werkzeuge. Du Gruppierst nach jenen Feldern, welche für Dich bestimmen, was nun ein doppelter Eintrag ist, und was nicht. Dabei können eventuell auch zuätzliche Funktionen notwendig sein, welche aber dann nicht zwangsläufig in Standard-SQL verfügbar sind. Dabei filterst Du all diese Datensätze aus, bei denen Count() eins ergibt, also jene die nur einmal vorkommen.

    Damit Du diese Ergebnisse auch verwenden kannst um alle relevanten Datensätze eindeutig zu identifizieren, wäre es sinnvoll, diese Einträge eventuell durch ein einfaches aneinanderfügen der Werte zu einem einzigen String eindeutig zu machen, womit Du dann die ID-Werte abfragen kannst.

    Beispiel:
    SELECT id FROM tabelle
       WHERE name||vorname IN
       ( SELECT name||vorname FROM tabelle
          GROUP BY name,vorname
            HAVING count(*) >1)

    Das ist zwar eine Variante, so etwas mit einem Statement abzudecken, allerdings wird es ziemich unperformant sein. Besser wäre IMHO so etwas über ein Programm abzudecken, daß diese Arbeit mit zwei Statements erledigt.

    Noch besser wäre es, diese Prüfung bereits vor dem Einfügen zu machen (z.B. mit Constraints) um doppelte Einträge gleich gar nicht in die Datenbank zu schreiben.

    Grüße
      Klaus