(SQL) Die doppelten Einträge einer Tabelle ermitteln
Ole
- datenbank
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-)>
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
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
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
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
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
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
moin
select primarykeyfields from table group by doublefields where count(*) > 1
leider funktioniert das nicht :(
trotzdem danke....andere vorschläge?
so long
ole
(8-)>
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
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