Seite 1 von 2

[gelöst] In SQLite eine bestimmte Reihe auslesen

Verfasst: 14.03.2009 16:55
von Sebastian
Ich stehe vor der Aufgabe, dass ich eine ganz bestimmte Reihe auslesen möchte. Ich kenne den Dateninhalt nicht, ich weiß auch die ID des entsprechenden Datensatzes nicht, ich weiß aber, dass es genau z.B. der 8te Datensatz ist, der erstellt worden ist, denn die Daten werden mit Select ja in der Reichenfolge der Erstellung ausgegeben, sofern kein ORDER BY verwendet wird. Wie also kann ich genau den 8ten Datensatz auslesen, ohne dass ich 8x NextDatabaseRow aufrufen muss oder ist das die einzige Lösung? Wie schnell arbeitet der Befehl? Was passiert bei 1000 Datensätzen? Gibt es nicht irgendeine SQL-seitige Lösung, den entsprechenden Datensatz anzubieten, ohne alle Daten durchgehen zu müssen?

Verfasst: 14.03.2009 17:51
von Falko
Nun verstehe ich nicht genau, was du da geschrieben hast. Die Spalte 8 könntest du auslesen, wenn du die Spaltenüberschrift wüsstest.
Und das geht mit Select from Tabellenname where Spaltenüberschrift.

Oder meinst du eine bestimmte Zeile 8 innerhalb dieser Spalte?

Das solltest du vielleicht genauer definieren.

Gruß, Falko

Verfasst: 14.03.2009 17:56
von Kaeru Gaman
nein, er meint einen kompletten bestimmten Datensatz anhand Laufender Nummer,
die nicht als extra Feld angelegt ist, Datensatzlänge unbekannt/beliebig.
ist der Index implement vorhanden, und wenn ja, wie lautet die abfrage "gib mir datensatz nummer 4711",
ohne dass man von vorne 4711 Datensätze abzählen muss.

worum es geht versteh ich durchaus, hab nur keinen plan von SQL, deshalb kann ich die Frage nicht beantworten.

vielleicht sollte ich echt mal wieder was mit datenbanken machen, fand ich früher immer unterhaltsam...

Verfasst: 14.03.2009 18:29
von - chris -
Ich habe eine Datenbank (Tabelle: info) mit 5 Spalten 'wert1,wert2,wert3,wert4,wert5' angelegt und mir das ganze im
SQLite Manager (FireFox) angeschaut, da gibt es eine Spalte 'rowid'.

Code: Alles auswählen


SELECT * FROM info WHERE rowid = 8;


Verfasst: 14.03.2009 18:39
von Falko
Ich glaube nicht, das überall rowid vergeben sein wird. Vielleicht sollte man
mit Limit besser klar kommen.
http://reeg.junetz.de/DSP/node10.html hat geschrieben:LIMIT
Mit LIMIT [offset,] rows kann angegeben werden, wie viele Zeilen man maximal von der
SELECT-Anweisung zurückgeliefert haben will. Mit `offset` kann man festlegen, ab welcher Zeile
angefangen werden soll. Ohne Angaben wird 0 angenommen. Mit `rows` legt man fest, wie viele Zeilen
man maximal ausgegeben haben möchte.
mysql> select * from table LIMIT 5,10; # gibt die Zeilen 6-15 zurück
mysql> select * from table LIMIT 5; # gibt die ersten 5 Zeilen zurück
mysql> select * from table LIMIT 0,5; # dasselbe nochmal
Ich würde dann folgendes probieren:

Code: Alles auswählen

select * from table LIMIT 8,1; # gibt die 8. Zeile zurück


Gruß, Falko

Verfasst: 15.03.2009 01:41
von Sebastian
Wow. Die Idee mit Limit ist gut. Das werde ich gleich morgen testen. Der Vorschlag mit RowID ist grundsätzlich nicht verkehrt. Natürlich habe ich auch eine ID, die als Primary Key (also auch autoincrement) definiert ist. ABER: Wenn eine Zeile gelöscht wird, dann wird natürlich auch dieser Platzhalter gelöscht. Wenn ich dann den 444ten Datensatz lesen will, dann ist dieser möglicherweise nicht mehr vorhanden... die anderen Datensätze "rutschen" ja nicht nach unten, sondern behalten ihre ID.

Verfasst: 15.03.2009 01:48
von Sebastian
AHA! Jetzt weiß ich auch, warum ich den Befehl LIMIT nicht kenne: der steht gar nicht in dem netten Büchlein :"SQL für Dummies". Nochmals Danke für den Tipp! Ich kann mir gut vorstellen, dass der Befehl genau das macht, was ich mir erhoffe. Mir fällt ein Stein vom Herzen. Ich liebe echt dieses Forum. Ohne Eure Hilfe hätte ich mich schon oft einsargen lassen!

Verfasst: 15.03.2009 01:53
von Sebastian
So, nach einer kleinen Recherche in der SQLite-Referenz darf ich nunmehr sagen: Chris hat vollkommen Recht! Die ROWID wird tatsächlich IMMER vergeben. Wenn man einen PRIMARY KEY anlegt, dann verweist er nur auf die ROWID, diese wird aber grundsätzlich angelegt. Das ist doch ganz interessant zu wissen, oder? :)

Verfasst: 15.03.2009 01:56
von ts-soft
hier findeste einen IncludeFile, damit kannste auch die letzte "LastInsertRowId" ermitteln, falls benötigt.

Verfasst: 15.03.2009 08:24
von DarkDragon
Vor allem sollte man wissen, dass laut der Definition einer Relationalen Datenbank die Ordnung, wie es intern gespeichert wird keine Rolle spielt und von DBMS zu DBMS unterschiedlich sein kann, da es ja Mengen sind mit denen man arbeitet. Man kann also nicht davon ausgehen, dass die Reihenfolge des Auslesens gleich der Reihenfolge des Einfügens ist, es sei denn man fixiert jedes Tupel anhand eines zu sortierenden Werts.