Ole: (SQL) Die doppelten Einträge einer Tabelle ermitteln

moinmoin

ich glaub ich bin mal wieder mit betriebsblindheit geschlagen.

ich hätte gerne nur die einträge aus einer db die doppelt sind, den rest nicht, aber irgendwie mag mir das heute absolut nicht gelingen.

bisher hab ich eine lösung in coldfusion, allerdings hab ich mir das so umständlich gemacht, das die abfrage nahezu 6 minuten braucht bis ich ergebnisse angezeigt bekomme und das ist mir schon ein wenig zu lang.

damit ihr auch seht das cih fleißig war hier mein cf code:

<cfquery datasource="bla" name="abfrage">
 select * from adressen order by name
</cfquery>

<cfquery datasource="bla" name="abfrage3">
 select * from adressen order by name
</cfquery>

<cfset vergleich = ArrayNew(2)>
<cfset temp1 = "">
<cfset temp2 = "">
<cfset i = 1>

<cfloop query="abfrage">
 <cfset temp1 = #name#>
 <cfset temp2 = #vorname#>
 <cfset irgendwas = 0>

<cfif #i# NEQ 1>
     <cfset a = #i# -1>
  <cfloop index="n" from ="1" to="#a#">
   <cfif #temp1# EQ #vergleich[n][1]# and #temp2# EQ #vergleich[n][2]#>
    <cfset irgendwas = 1>
   </cfif>
  </cfloop>
 </cfif>

<cfif #irgendwas# eq 0>

<cfloop query="abfrage3">

<cfif #name# EQ #temp1# AND #vorname# EQ #temp2#>
    <cfset vergleich[i][1] = #name#>
    <cfset vergleich[i][2] = #vorname#>
    <cfset i = #i# + 1>
    <cfbreak>
   </cfif>
  </cfloop>
 </cfif>
</cfloop>

aber eigentlich tut der ja ncihts zur sache, da ich das ganze gerne sofort in sql gelößt hätte, nur komm ich nicht drauf :(

irgendwer enn tip für mich?
oder gar die lösung meines problems? ;)

dank euch

alles liebe
ole
(8-)>

  1. Moin Moin !

    Als Schnellschuß:

    select primarykeyfields from table group by doublefields where count(*) > 1

    Je nach DB etwas anders, aber das ist das Prinzip.

    Alexander

    1. Hallo zusammen,

      Einen Unique Index auf das Feld der Tabelle legen, das man untersuchen will.

      Dann eine Abfrage auf alle Einträge mit der Abfrage auf alle Ersteinträge vergleichen. Alle Datensätze, die NICHT in der Liste der Ersteinträge sind, sind doppelt.

      Das ist die Differenzmenge der Abfrage GESAMT - NURERSTE

      So, und nun das ganze in SQL oder?

      Au weia, da trete ich mal zurück

      Gruß

      Tom

      1. Hi,

        Einen Unique Index auf das Feld der Tabelle legen,
        das man untersuchen will.

        das geht nicht. Schon der Versuch wird mit einer
        Fehlermeldung zurückgewiesen.

        Wenn ein UNIQUE INDEX auf einer Spalte liegen soll,
        denn definiert seine Existenz einen Zustand, der im
        vorliegenden Fall jedoch nicht gegeben ist.

        Viele Grüße
        <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

        1. Hallo Michael,

          Einen Unique Index auf das Feld der Tabelle legen,
          das man untersuchen will.

          das geht nicht. Schon der Versuch wird mit einer
          Fehlermeldung zurückgewiesen.

          Wenn ein UNIQUE INDEX auf einer Spalte liegen soll,
          denn definiert seine Existenz einen Zustand, der im
          vorliegenden Fall jedoch nicht gegeben ist.

          Oh ja, wie Recht Du hast. Aber anderseits liegt genau da die Lösung. Jetzt sehe ich sie...

          Man muss die Struktur der Tabelle kopieren, dann auf die leere Tabelle den Unique Index legen und Satz für Satz versuchen rüberzukopieren. Immer, wenn es beim Kopieren einen Fehler gibt, ist ein doppelter Eintrag gefunden.

          Dann kann man allerdings auch gleich die Tabelle mit einem Script durcharbeiten. Man sortiert über das zu untersuchende Feld, merkt sich immer den letzten Wert und vergleich mit dem nächsten. Alle, die übereinstimmen, werden kopiert (zumindest die IDs). Wenn keine übreinstimmung mehr vorliegt, wird der letzte Wert auf den aktuellen weitergerückt.

          Nun muss man nur wissen, ob man den ersten Satz einer Gruppe auch haben will. Dr würde hier nicht registriert.

          Grüße aus Braunschweig

          Tom

          1. Hi Tom,

            Dann kann man allerdings auch gleich die Tabelle mit
            einem Script durcharbeiten. Man sortiert über das zu
            untersuchende Feld, merkt sich immer den letzten Wert
            und vergleich mit dem nächsten. Alle, die
            übereinstimmen, werden kopiert (zumindest die IDs).
            Wenn keine übreinstimmung mehr vorliegt, wird der
            letzte Wert auf den aktuellen weitergerückt.

            und genau das alles macht "group by" implizit - noch
            dazu, ohne diese ggf. riesige Datenmenge über die
            DBM-API an ein Anwendungsprogramm ausliefern zu
            müssen).

            Wieso also selbst etwas programmieren?

            Viele Grüße
            <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

            1. Hallo Michael,

              und genau das alles macht "group by" implizit - noch
              dazu, ohne diese ggf. riesige Datenmenge über die
              DBM-API an ein Anwendungsprogramm ausliefern zu
              müssen).

              Wieso also selbst etwas programmieren?

              Das ist wahr. LowTraffic ist gefragt. Wenn's sen funxt...

              Grüße an Alle

              Tom

    2. moin

      select primarykeyfields from table group by doublefields where count(*) > 1

      leider funktioniert das nicht :(

      trotzdem danke....andere vorschläge?

      so long
      ole
      (8-)>

      1. Hi,

        select primarykeyfields from table group by doublefields where count(*) > 1
        leider funktioniert das nicht :(

        was genau meinst Du mit dieser Aussage?
        Poste mal das SQL-Statement, das Du formuliert hast.

        Du mußt das Prinzip natürlich
        1. verstehen,
        2. auf Deinen SQL-Dialekt und
        3. auf Deine Tabellen- und Feldnamen übersetzen.

        Und Du mußt das count(*)-Feld temporär mit einem Namen
        versehen, weil es Du sonst nicht sinnvoll in einer
        WHERE-Klausel verwenden kannst.

        trotzdem danke....andere vorschläge?

        Keine annähernd so sinnvollen.

        Viele Grüße
        <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

        1. Hi

          Und Du mußt das count(*)-Feld temporär mit einem Namen
          versehen, weil es Du sonst nicht sinnvoll in einer
          WHERE-Klausel verwenden kannst.

          Ein count(*) kann gar nie in einer where-clause verwendet
          werden, zu dem Zeitpunkt steht sein Inhalt noch gar nicht
          fest. Deswegen gibts Having was dann im Result-Set Records
          rausschmeissen kann.

          Gruss Daniela