Hallo,
ich benutze in meinem QT-Programm sqlite und wollte wissen ob es eine Abfrage gibt, welche mir den indes eines Datensatzes zurück gibt. also zum Beispiel suche ich nach einem String und will nur wissen ob das jetzt die 1. oder 3. ... Zeile in der Tabelle ist.
Hat jemand einen Vorschlag?
Danke
acdc
sqlite abfrage
im Query die ROWID mit abfragen
Code: Alles auswählen
SELECT $(meine_attribut_liste) ROWID FROM <...>
die ROWID muss nicht fortlaufend sein !im Query die ROWID mit abfragen
wenn du zeilen loeschst, kann die lücken bekommen.
Also spaetestens wenn nen INT PK anlegst, hasst die ROWID vollstaendig unter eigener controlle ... d.h. du kannst die IDS selber bestimmen, nix mehr mit autoincrement !If a table contains a column of type INTEGER PRIMARY KEY, then that column becomes an alias for the ROWID.
@acdc
Prinzipiell ist in deinem Design irgendwas "faul" wenn du zu brauchen gedenkst !
Hast du in deinen Daten positionelle Infos, solltest du das auch so modellieren und auch die Intigrität wahren. Ergo ne Posi Spalte pflegen !
Oder brauchst du das nur intern fuern zugriff ? dann deinen Aufbau ueberdenken .... du bekommst doch ein ergebniss-set (RecordSet) von deiner Abfrage ! Das musst doch durchlaufen, damit hasst ja impliziet nen Index .
Also fuer was brauchst Du das ?
Ciao ....
@RHBaum
Das mit der RowId ist richtig, ich hab auch einen Primärschlüssel und wenn ich Records lösche, so entstehen Lücken.
Habe es daher so gelöst:
"SELECT COUNT(*) FROM kundendaten WHERE id <= aktuelleID"
Ich zähle einfach die Datensätze, die kleiner bzw. gleich sind und so kenne ich die Position.
Das Ganze benötige ich einfach um anzuzeigen, dass zum Beispiel gerade der 4. Datensatz angezeigt wird. So wie "3 von 40".
Danke für die schnellen Rückmeldungen!
acdc
Das mit der RowId ist richtig, ich hab auch einen Primärschlüssel und wenn ich Records lösche, so entstehen Lücken.
Habe es daher so gelöst:
"SELECT COUNT(*) FROM kundendaten WHERE id <= aktuelleID"
Ich zähle einfach die Datensätze, die kleiner bzw. gleich sind und so kenne ich die Position.
Das Ganze benötige ich einfach um anzuzeigen, dass zum Beispiel gerade der 4. Datensatz angezeigt wird. So wie "3 von 40".
Danke für die schnellen Rückmeldungen!
acdc
das mit der count iss dann aber von hinten durch die Brust ....dass zum Beispiel gerade der 4. Datensatz angezeigt wird. So wie "3 von 40".
Deine Abfrage, mit was executest du die ?
Benutzt du QSQLQuery, solltest du mit size() z.b. die Anzahl der Zeilen bekommen, die deine Abfrage liefert ...
Bei ziemlich komplexen Abfragen kann dir das aber auch die Performance zerreissen ...
Wenn du nen richtiges RDBMS verwendest, sollten dir die SQL treiber schon die ersten zeilen liefern, waehrend der Server im hintergrund noch fleissig am roedeln ist.
Mit ner aggregatsfunktion muss er zumindest fuer das aggregat die benoetigte subabfrage komplett umsetzen. Wenn das "where" im Statement kompliziert ist, und deine Tabellen ziemlich gross, kann das ewig dauern, waerend ein "select * from ... where" mit der selben where bedingung Dir scho recht schnell die ersten zeilen liefern könnte.
Nen size wird dann entweder ned untertsuetzt, oder es dauert bis die komplette Abfrage durch iss (also ewig).
Das aber nur als Hinweiss, das dir so nen simples X von Y teuer werden könnte !
Verwendest du ein QSQLQueryModel ? Dann koenntest du das Model direkt fragen, wieviel Eintraege es denn scho hat ...
Ciao ...