[gelöst] In SQLite eine bestimmte Reihe auslesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

[gelöst] In SQLite eine bestimmte Reihe auslesen

Beitrag 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?
Zuletzt geändert von Sebastian am 15.03.2009 10:08, insgesamt 1-mal geändert.
(Win 11 64-bit, PB 6.04 und 6.10)
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Beitrag 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;

Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Beitrag 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.
(Win 11 64-bit, PB 6.04 und 6.10)
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Beitrag 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!
(Win 11 64-bit, PB 6.04 und 6.10)
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Beitrag 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? :)
(Win 11 64-bit, PB 6.04 und 6.10)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

hier findeste einen IncludeFile, damit kannste auch die letzte "LastInsertRowId" ermitteln, falls benötigt.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten