Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FreePascal Die letzte Zeile aus der DB schnell auslesen? (https://www.delphipraxis.net/183382-die-letzte-zeile-aus-der-db-schnell-auslesen.html)

AlexII 6. Jan 2015 13:29

Datenbank: SQLite • Version: 3 • Zugriff über: SQLite3Connection

Die letzte Zeile aus der DB schnell auslesen?
 
Hallo,

kann man die letzte Datenzeile aus der DB ohne einer Schleife auslesen?
Zur Zeit mache ich es so, würde aber die Abfrage etwas verkürzen, Falls machbar ist, da bei vielen Datensätzen kann man Code sehr langsam sein.

Delphi-Quellcode:
    // Die letzte Kundennummer des Teilnehmers auslesen
    SQLQueryLastKNr.Close;
    SQLQueryLastKNr.SQL.Text := 'SELECT knr FROM tbteilnehmer';
    SQLQueryLastKNr.Open;

    while not SQLQueryLastKNr.Eof do
    begin
      LastKNr := SQLQueryLastKNr.FieldByName('knr').AsInteger;
      SQLQueryLastKNr.Next;
    end;
    // Ende

    SQLQuery1.ParamByName('knr').AsInteger := LastKNr + 1;
Danke!

Bernhard Geyer 6. Jan 2015 13:34

AW: Die letzte Zeile aus der DB auslesen?
 
Und was kennzeichnet eine letzte Datenzeile aus?
DBs sind mengenorientiert. Solange du nicht definierst was "letzte Datenzeile" ausmachst geht das nicht.
Deine Abfrage wird nur zufälligerweise das gewünschte Ergebnis liefern. Mein Goldkugel sagt mir das du eine Autoinc-ID mitführst und der größte Wert dem letzten eingefügten Datensatz entspricht den du haben willst.

Also ein

Code:
SELECT Max(knr) FROM tbteilnehmer group by knr

AlexII 6. Jan 2015 13:37

AW: Die letzte Zeile aus der DB schnell auslesen?
 
AUTOINCREMENT ist bei mir nur die ID, die Kundennummer nicht, da SQLite AUTOINCREMENT nur ein Mal erlaubt. Ich muss also die Kundennummer selber hoch zählen, daher
Zitat:

SQLQuery1.ParamByName('knr').AsInteger := LastKNr + 1;
Wieso machst Du eigentlich "group by knr"?

Bernhard Geyer 6. Jan 2015 13:40

AW: Die letzte Zeile aus der DB schnell auslesen?
 
Zitat:

Zitat von AlexII (Beitrag 1285584)
Wieso machst Du eigentlich "group by knr"?

I.d.R. muss man bei Aggregatfunktionen (http://www.w3schools.com/sql/sql_functions.asp) ein Group By machen wenn man sie anwenden will. Im Obigen fall ist das aber falsch aus dem Kopf geschrieben. Lass es einfach weg.

mjustin 6. Jan 2015 13:42

AW: Die letzte Zeile aus der DB schnell auslesen?
 
Zitat:

Zitat von AlexII (Beitrag 1285580)
kann man die letzte Datenzeile aus der DB ohne einer Schleife auslesen?

Ja, wie beschrieben mit MAX(), wenn auf dem relevanten Feld (hier die Kundennummer) ein Index existiert.
Je nach Datenbank ist ein absteigend sortierter Index erforderlich wenn es möglichst schnell funktionieren soll.
(InterBase in den mir bekannten Versionen klappert bei MAX und nur aufsteigendem Index noch durch alle Sätze)

himitsu 6. Jan 2015 13:47

AW: Die letzte Zeile aus der DB schnell auslesen?
 
Laut Beschreibung/Überschrift woller er ja nicht die größte Nummer, sondern die Letzte, also
SQL-Code:
SELECT knr FROM tbteilnehmer ORDER BY xxx DESC LIMIT 1
:stupid:
xxx = akn
oder nach was auch immer die Daten sortiert sein sollen (z.B. insert_date oder so)


Ansonsten wäre sein Code auch irgendwie falsch.
Delphi-Quellcode:
LastKNr := -1; // warum hast du die Variable nicht initialisiert? Was soll denn rauskommen, wenn es keine Datensätze gibt!
while not SQLQueryLastKNr.Eof do
begin
  if LastKNr < SQLQueryLastKNr.FieldByName('knr').AsInteger then
    LastKNr := SQLQueryLastKNr.FieldByName('knr').AsInteger;
  SQLQueryLastKNr.Next;
end;

AlexII 6. Jan 2015 13:48

AW: Die letzte Zeile aus der DB schnell auslesen?
 
Habe diese Selektion gefunden, die gut funktioniert. :thumb:

Delphi-Quellcode:
SELECT knr FROM tbteilnehmer WHERE id_teilnehmer=(SELECT MAX(id_teilnehmer) FROM tbteilnehmer)


Die id_teilnehmer hat wohl den Index, die knr nicht wie es scheint.

himitsu 6. Jan 2015 13:52

AW: Die letzte Zeile aus der DB schnell auslesen?
 
SQL-Code:
SELECT knr FROM tbteilnehmer ORDER BY id_teilnehmer DESC LIMIT 1
:stupid: (Beschreibung siehe Nachtrag meine letzter Antwort)

p80286 6. Jan 2015 13:55

AW: Die letzte Zeile aus der DB schnell auslesen?
 
Zitat:

Zitat von himitsu (Beitrag 1285587)
Laut Beschreibung/Überschrift woller er ja nicht die größte Nummer, sondern die Letzte, also
SQL-Code:
SELECT knr FROM tbteilnehmer ORDER BY xxx DESC LIMIT 1
:stupid:
xxx = akn
oder nach was auch immer die Daten sortiert sein sollen (z.B. insert_date oder so)

Zitat:

// Die letzte Kundennummer des Teilnehmers auslesen
Da wahrscheinlich mehrere Teilnehmer vorhanden sind, ist
SQL-Code:
select max(knr) from tbteilnehmer Group by teilnehmer-id
gar nicht so falsch.

Gruß
K-H

AlexII 6. Jan 2015 13:56

AW: Die letzte Zeile aus der DB schnell auslesen?
 
Zitat:

Zitat von himitsu (Beitrag 1285589)
SQL-Code:
SELECT knr FROM tbteilnehmer ORDER BY id_teilnehmer DESC LIMIT 1
:stupid: (Beschreibung siehe Nachtrag meine letzter Antwort)

Was heißt "DESC LIMIT 1"?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz