| 

.NET C# Java Javascript Exception

In einer Tabelle nach Duplikaten suchen und sie bearbeiten

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


In einer Tabelle nach Duplikaten suchen und sie bearbeiten

turmaline - 30.11.2010 17:00
Hallo Leute,

habe hier eine auf den ersten Blick eine einfache Aufgabe. Da ich mich aber sehr wenig mit Groovy und mit SQL auskenne, kriege ich es nicht hin.
Ich habe eine Tabelle file, in der unter anderem hash_code und size werte einer Datei gespeichert sind. Nun es kann also vorkommen, dass in der Tabelle mehrere Dateien vorkommen, die dieselben Werte für hash_code und size haben. Für diese dublierten Dateien würde ich in einer bereits vorhanden (leeren) spalte ref_id dieselbe id reinschreiben. Also zum Beispiel, wenn es zwei Einträge mit denselben hash_code- und size-Werten gibt, würde ich die dazugehörige id in die ref_id speichern. Nun ich dachte ich gruppiere zuerst die Zeilen so:

String groupingQuery = "SELECT id, ref_id, name, size, hash_code FROM file GROUP BY name, hash_code, size"
        sql.execute (groupingQuery)

Wie kann ich über Gruppen dann iterrieren und die Werte von ref_id ändern? Kann mir jemand helfen?
Deweiteren habe ich ein Problem, dass ich das Skript zum Testen mehrmals ausführe und dort die Zeilen in meiner Tabelle file hinzufüge. Wenn die Zeilen aber hinzugefügt wurden, gibt es bei der nächsten Ausführung einen Fehler, dass die Spalten bereits existieren. Die Spalten hinzufüge ich so:

String insertQuery = "ALTER TABLE file ADD size INTEGER, hash_code VARCHAR(255), ref_id NUMERIC(19,0)"
sql.execute (insertQuery)

wie könnte ich vor dem Hinzufügen der Zeilen überprüfen ob sie bereits existieren und wenn ja diesen Schritt der Hinzufügung einfach überspringen.

Ich wäre dankbar für die Hilfe.

Gruß, madlena


Re: In einer Tabelle nach Duplikaten suchen und sie bearbeiten

Wicki - 01.12.2010 08:13
Hallo,

ich habe mal mit einer MySQL-Datenbank experimentiert und bin zu folgendem Ergebnis gekommen:
- zunächst habe ich eine temporäre Tabelle "tempTable" erzeugt, die genau die von Dir beschriebene Gruppe enthalten soll
CREATE TABLE tempTable
SELECT id,hash_code,size FROM file
WHERE hash_code IN
(SELECT hash_code FROM file
GROUP BY hash_code, size HAVING count(*) >1)
AND size IN
(SELECT size FROM file
GROUP BY hash_code, size HAVING count(*) >1)
- nun folgt die UPDATE-Anweisung für die Tabelle "file" mit Hilfe von "tempTable"
UPDATE file SET ref_id=id
WHERE hash_code IN
(SELECT hash_code FROM tempTable
GROUP BY hash_code, size HAVING count(*) >1)
AND size IN
(SELECT size FROM tempTable
GROUP BY hash_code, size HAVING count(*) >1)
Die Tabelle "tempTable" kann natürlich danach gelöscht werden.
Zu Deinem anderen Problem:
Mit "ALTER" änderst Du die Struktur einer Tabelle und mit "INSERT" kannst Du neue Daten einfügen.

Gruß Wicki


Re: In einer Tabelle nach Duplikaten suchen und sie bearbeiten

turmaline - 01.12.2010 15:55
Hey Wicki,

danke für Deine Antwort, sie hat mir auf jeden Fall weitergeholfen. Die zweite Anfrage hat leider nicht das gemacht was ich wollte (die ref_id hätte bei den Duplikaten gleich sein sollen). So habe ich nun das Problem gelöst:

String duplicateGroupingQuery = "SELECT id, ref_id, hash_code, name FROM file WHERE hash_code IN (SELECT hash_code FROM file GROUP BY name, hash_code) AND name IN (SELECT name FROM file GROUP BY name, hash_code)"
			def ref_id = [:]
			def hash_code = [:]
			def name = [:]
		sql.eachRow (duplicateGroupingQuery) { row ->
			if (!hash_code.equals(row.hash_code) || !name.equals(row.name)) {
				ref_id = row.id
				hash_code = row.hash_code
				name = row.name
			        sql.executeUpdate ("UPDATE file SET ref_id = ? WHERE name = ? AND hash_code = ? ", [ref_id, name, hash_code])
			}
				
		}

Also wie Du siehst, ich erstelle keine temporäre Tabelle, sondern iteriere über die Ergebnisse trage dann bei den Duplikaten dieselbe id als ref_id.

Zu meinem andren Problem: ich habe Dich nicht so gant verstanden. Die Spalten müssen vorher schon hinzugefügt werden, nur wenn das bereits gemacht wurde, gibt es einen Fehler. Und ich weiß es nicht im Voraus ob das gemacht wurde oder nicht, also ob die Spalten bereits da sind oder nicht. Wie kann mit da INSERT-Anweisung helfen?? Oder wie meintest Du das.

lG, madlena


Re: In einer Tabelle nach Duplikaten suchen und sie bearbeiten

Wicki - 01.12.2010 18:04
Hallo Madlena,

ich verstehe auch nicht ganz was Du da meinst. Anfangs arbeitest Du mit der "file"-Tabelle und deren fraglichen Spaltennamen und später fügst Du mit "ALTER" genau diese fraglichen Spalten hinzu.
Wie dem auch sei, wenn Du wissen willst, ob eine Tabelle bestimmte Spaltennamen enthält, so gibt es meines Wissens in den verschiedenen Datenbanken bestimmte Views mit diesen Informationen. Mit einer Testabfrage sollte es allerdings auch funktionieren:
	  String res = sql.firstRow("select * from file")
	  println "res:" + res
	  if (res.indexOf("fraglicheSpalte=")<0)
		println "Spalte existiert nicht !"

Gruß Wicki


Re: In einer Tabelle nach Duplikaten suchen und sie bearbeiten

turmaline - 02.12.2010 12:54
Hey Wicky,

ja Du hast Recht, ich mache "fragliche Sachen" mit den Daten. Das hängt mit der Migration von Daten zusammen.
Jedenfalls Danke ich Dir für die Hilfe, das mit den Spalten hat funktioniert!

Gruß,madlena


Re: In einer Tabelle nach Duplikaten suchen und sie bearbeiten

turmaline - 14.12.2010 09:24
diese Lösung ist etwas fehlerhaft, denn wenn die Tabelle keine Einträge hat, wird die indexOf-Methode eine NullPointerException schmeißen... :(


Re: In einer Tabelle nach Duplikaten suchen und sie bearbeiten

Wicki - 15.12.2010 11:20
Hallo,

die Exception kann man abfangen ...
Für eine MySQL-Datenbank ergibt sich jedoch eine einfachere Möglichkeit mit der SQL-Anweisung "DESCRIBE", die die Eigenschaften (u.a. Feldnamen) der Tabelle ausgibt:
import  java.sql.*
.
.
.
try {	
	  def spl="fraglicheSpalte"
	  def exist = false
	  db.eachRow("describe partner") { //describe für MySQL
//	  	println "------"+it
	    if (it =~ spl) {  //Feldname in der Zeile enthalten
	      println "Spalte '"+spl+"' existiert !"
	      exist=true
	    }
	  }
	  if (!exist)
	    println "Spalte '"+spl+"' existiert nicht !"
} catch(SQLException ex) {
	println "****** SQL-Fehler:"
	println ex.getMessage()
} finally {
	db.close()
}
Das Abfangen der SQLException ist nur für den Fall erforderlich, daß die Tabelle nicht existiert.

Gruß Wicki


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "In einer Tabelle nach Duplikaten suchen und sie bearbeiten" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.