Seite 2 von 2
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Donnerstag 10. Februar 2011, 15:45
von McAce
@sparrow deine Lösung sieht ziemlich gut aus leider bekomme ich das nicht in SQLite umgesetzet,
mache erst einmal eine Pause vielleicht hilft das
McAce
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Donnerstag 10. Februar 2011, 16:40
von sparrow
Das Problem: sqlite3 kann nicht 2
Spalten aus Subqueries.
Mit || verbindet man den Inhalt zweier Felder. Also bauen wir uns die Rückgabe entsprechend zussammen.
Auf meiner Beispieltabelle müsste also folgendes funktionieren:
Code: Alles auswählen
DELETE FROM testt WHERE name || dat NOT IN (SELECT name || MAX(dat) FROM testt GROUP BY name)
Ist ungetestet, sollte aber tun.
Falls du Fragen hast, heraus damit.
Gruß
sparrow
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Donnerstag 10. Februar 2011, 18:22
von BlackJack
@Rainier: Das ist AFAIK kein Standard-SQL und es ist ja auch keine Zeilennummer sondern eben eine ID. Am Anfang war die Vorgabe ja noch eine zufällige Zeile über die "Zeilennummer" zu löschen.
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Donnerstag 10. Februar 2011, 18:57
von sparrow
Code: Alles auswählen
import sqlite3
con = sqlite3.connect(':memory:')
cursor = con.cursor()
cursor.execute("CREATE TABLE test (name VARCHAR, dat DATE)")
cursor.execute("INSERT INTO test (name, dat) VALUES ('a', date('2011-02-15'))")
cursor.execute("INSERT INTO test (name, dat) VALUES ('a', date('2011-02-20'))")
cursor.execute("INSERT INTO test (name, dat) VALUES ('a', date('2011-04-11'))")
cursor.execute("INSERT INTO test (name, dat) VALUES ('v', date('2011-01-08'))")
cursor.execute("INSERT INTO test (name, dat) VALUES ('v', date('2011-04-16'))")
cursor.execute("INSERT INTO test (name, dat) VALUES ('v', date('2011-07-18'))")
cursor.execute("INSERT INTO test (name, dat) VALUES ('b', date('2011-02-01'))")
cursor.execute("INSERT INTO test (name, dat) VALUES ('b', date('2011-02-03'))")
cursor.execute("INSERT INTO test (name, dat) VALUES ('l', date('2011-02-04'))")
cursor.execute("INSERT INTO test (name, dat) VALUES ('m', date('2011-02-05'))")
cursor.execute("INSERT INTO test (name, dat) VALUES ('m', date('2011-02-06'))")
print "Vorher:"
for t in cursor.execute("SELECT * FROM test"): print t
print "----"
deletequery = "DELETE FROM test WHERE name || dat NOT IN " \
"(SELECT name || MAX(dat) FROM test GROUP BY name)"
cursor.execute(deletequery)
print "Nachher:"
for t in cursor.execute("SELECT * FROM test"): print t
cursor.close()
con.close()
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Freitag 11. Februar 2011, 21:17
von McAce
Vielen Dank für den Hinweis, jetzt klappt es.
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Freitag 4. März 2011, 13:04
von McAce
Hi,
kann mich jetzt nach den Klausuren wieder damit beschäftigen
Ich kämpfe jetzt damit das ich anstelle des Datums jetzt eine Floatzahl habe (REAL).
Da || ja ein Stringkonkatenator ist kann ich die beiden Werte name und zahl ja nicht verknüpfen
wie bekomme ich das hin?
McAce
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Freitag 4. März 2011, 16:24
von frabron
Typecasting? Kann sqlite sowas? Und wieso ist dein Datum jetzt vom Typ real?
Edit
http://www.sqlite.org/lang_expr.html
http://www.sqlite.org/c3ref/mprintf.html
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Montag 7. März 2011, 09:56
von sparrow
Hast du es einfach mal probiert?
Mal ganz abgesehen davon, dass ich in dem vorherigen Code ja schon einen String und ein Datum mit || verbunden habe.
Das geht also nicht nur mit Strings.
Code: Alles auswählen
import sqlite3
import random
con = sqlite3.connect(':memory:')
cursor = con.cursor()
cursor.execute("CREATE TABLE test (n VARCHAR, d FLOAT)")
cursor.execute("INSERT INTO test (n, d) VALUES ('a', ?)", (random.random(),) )
cursor.execute("INSERT INTO test (n, d) VALUES ('a', ?)", (random.random(),) )
cursor.execute("INSERT INTO test (n, d) VALUES ('a', ?)", (random.random(),) )
cursor.execute("INSERT INTO test (n, d) VALUES ('v', ?)", (random.random(),) )
cursor.execute("INSERT INTO test (n, d) VALUES ('v', ?)", (random.random(),) )
cursor.execute("INSERT INTO test (n, d) VALUES ('v', ?)", (random.random(),) )
cursor.execute("INSERT INTO test (n, d) VALUES ('b', ?)", (random.random(),) )
cursor.execute("INSERT INTO test (n, d) VALUES ('b', ?)", (random.random(),) )
cursor.execute("INSERT INTO test (n, d) VALUES ('l', ?)", (random.random(),) )
cursor.execute("INSERT INTO test (n, d) VALUES ('m', ?)", (random.random(),) )
cursor.execute("INSERT INTO test (n, d) VALUES ('m', ?)", (random.random(),) )
print "Vorher:"
for t in cursor.execute("SELECT * FROM test"): print t
print "----"
deletequery = "DELETE FROM test WHERE n || d NOT IN " \
"(SELECT n || MAX(d) FROM test GROUP BY n)"
cursor.execute(deletequery)
print "Nachher:"
for t in cursor.execute("SELECT * FROM test"): print t
cursor.close()
con.close()
Macht bei mir:
Code: Alles auswählen
Vorher:
(u'a', 0.06153580392253222)
(u'a', 0.17540563549178978)
(u'a', 0.6532116785416114)
(u'v', 0.7049099555607308)
(u'v', 0.0660415757282301)
(u'v', 0.5568942848148242)
(u'b', 0.7574893473574899)
(u'b', 0.8842254785434168)
(u'l', 0.5659690705623256)
(u'm', 0.2888894289300361)
(u'm', 0.07183194624757139)
----
Nachher:
(u'a', 0.6532116785416114)
(u'v', 0.7049099555607308)
(u'b', 0.8842254785434168)
(u'l', 0.5659690705623256)
(u'm', 0.2888894289300361)
Und das sieht verdächtig nach dem aus was du brauchst und geändert hab ich nichts, außer andere Date zu schreiben.
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Montag 7. März 2011, 12:19
von McAce
Das verstehe ich jetzt nicht, ich hatte das genauso probiert bis auf die Tatsache das ich anstelle von
FLOAT REAL geschrieben hatte.
Soweit ich weiß ist das doch die Angabe von Float Zahlen in SQLite oder liege ich da jetzt falsch?
Grüße
McAce
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Montag 7. März 2011, 13:15
von sparrow
Ach, sqlite3 nimmt das eh nicht so ernst mit den Typen der Spalten.
Code: Alles auswählen
import sqlite3
con = sqlite3.connect(':memory:')
cur = con.cursor()
cur.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, dat INTEGER)")
cur.execute('INSERT INTO test (dat) VALUES (?)', (2,))
cur.execute('INSERT INTO test (dat) VALUES (?)', (144,))
cur.execute('INSERT INTO test (dat) VALUES (?)', (3.144,))
cur.execute('INSERT INTO test (dat) VALUES (?)', ('KEKS',))
print cur.execute("SELECT * FROM test").fetchall()
cur.close()
con.close()
Postgresql oder mySQL würden hier natürlich Alarm geben. Immerhin soll in ein Feld für Ganzzahlen ein String oder eine Fließkommazahl geschrieben werden. sqlite ist das egal, der nimmt halt das was kommt.
Gruß
Sparrow
Re: Die länge einer SQL Datenbank anzeigen lassen
Verfasst: Montag 7. März 2011, 17:33
von McAce
merkwürdig, ich glaube da setze ich mich noch mal vor und suche mal warum das bei
mir nicht geklappt hat.
Vielen Dank für den Tipp
McAce