Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird und LIMIT bei SELECT (https://www.delphipraxis.net/45945-firebird-und-limit-bei-select.html)

hsbc 15. Mai 2005 10:37

Datenbank: Firebird • Version: 1.5.2 • Zugriff über: Delphi 7 Professional + Zeos-Lib.

Firebird und LIMIT bei SELECT
 
Hallo allerseits,

kann es sein, dass Firebird das LIMIT bei SELECT nicht kennt?

SELECT * FROM Tabelle ORDER BY Feld1 LIMIT 20

ergibt bei mir eine Fehlermeldung.

Welche Alternativen kann ich hier verwenden, wenn ich immer nur die nächsten xx Datensätze auslesen möchte?

mfg
Herbert

hsbc 15. Mai 2005 10:58

Re: Firebird und LIMIT bei SELECT
 
Hat sich erledigt - hab es bereits selbst rausgefunden:

SELECT FIRST 20 * FROM ....

mfg
Herbert

kiar 15. Mai 2005 11:01

Re: Firebird und LIMIT bei SELECT
 
hallo,

ich weis nicht ob firebird einen Limit bezeichner hat. aus ib zeiten habe ich zwei stored proceduren von kosch , die das erledigen , damit bin ich aber auch zufrieden.

wenn du den quelltext möchtest, dann eine PN an mich.

raik

Edit// das ist ja einfach, werde wohl oder übel mich mal wieder intensiver mirt firebird beschäftigen müssen :wall:

hsbc 15. Mai 2005 13:12

Re: Firebird und LIMIT bei SELECT
 
Hallo kiar,

LIMIT geht einwandfrei bei Firebird und zwar mit folgender Syntax:

SELECT FIRST xx SKIP yy <column1, column2> FROM <table> ORDER BY <column1>

wobei xx der Anzahl an Zeilen entspricht, die du zurückbekommst, wobei yy Zeilen vorher übersprungen werden.

Was ich noch suche:

Eine Möglichkeit, die das gleiche unter MSSQL macht - bisher leider nichts gefunden.

mfg
Herbert

Union 15. Mai 2005 13:48

Re: Firebird und LIMIT bei SELECT
 
Zitat:

Zitat von hsbc
Hallo kiar,

LIMIT geht einwandfrei bei Firebird und zwar mit folgender Syntax:

SELECT FIRST xx SKIP yy <column1, column2> FROM <table> ORDER BY <column1>

wobei xx der Anzahl an Zeilen entspricht, die du zurückbekommst, wobei yy Zeilen vorher übersprungen werden.

Was ich noch suche:

Eine Möglichkeit, die das gleiche unter MSSQL macht - bisher leider nichts gefunden.

mfg
Herbert

Bei MSSQL heisst es:
SQL-Code:
SELECT TOP N

alcaeus 16. Sep 2005 13:37

Re: Firebird und LIMIT bei SELECT
 
Hallo ihr,

in mySQL kann ich ja folgendes schreiben:
SQL-Code:
SELECT * FROM tablename ORDER BY somefield LIMIT 15, 30
Wie wuerde der Befehl in Firebird aussehn? Sind Skip die Anzahl Zeilen die Uebersprungen werden, also so:
SQL-Code:
SELECT FIRST 15 SKIP 29 FROM tablename ORDER BY somefield
Ich will ja ab dem 30. Datensatz 15 haben, also muss ich 29 ueberspringen, sehe ich das richtig?

Thanks and Greetz
alcaeus

Robert_G 16. Sep 2005 13:48

Re: Firebird und LIMIT bei SELECT
 
Ehrlich gesagt halte ich herzlich wenig von solchen Konstrukten.
Ist ähnlich wie setLength in .Net : Es sieht so simple aus, dass man schnell vergisst wieviele Resourcen man dabei verbrät...

Du kannst das in FB simulieren indem du eine selectable procedure schreibst, die einfach ein SELECT first ZuÜberschringende+ZuSelektierende records ausführt.
Innerhalb der schleife verwirfst du die zu überspringenden Datensätze.
Und schon sieht man ganz gut, warum sowas ziemlich viel Rechenzeit den Gullie runterspült...

alcaeus 16. Sep 2005 13:52

Re: Firebird und LIMIT bei SELECT
 
Nichts fuer ungut Robert, aber da gibt es ein paar Problemchen.
Ich brauche das, weil ich ein zusaetzliches Datenbankmodul fuers phpBB2 baue. Dieses Modul abstrahiert die Funktionen, so dass es dem Anwendungsscript herzlich egal ist, welche DB dahintersteckt ;)
Bei DB-Systemen die LIMIT x, y nicht verstehn, muss ich das also umbiegen. Procedures kaemen hier nicht in Frage, dazu muessten sehr viele Queries im phpBB angepasst werden, und das will ich mir nicht antun.

Es geht nur darum, ob ich 1 subtrahieren muss oder nicht, also ob die Anzahl nach SKIP x wirklich uebersprungen werden, und erst der x+1te Datensatz als erster zurueckkommt.

Greetz
alcaeus

Robert_G 16. Sep 2005 14:04

Re: Firebird und LIMIT bei SELECT
 
Du kannst in eine selectable procedure genauso abfragen wie eine Tabelle.
Du bekommst natürlich etwas Overhead. Zusätzlich zu dem bestehenden Overhead von solchen "ich frage mal 1.000 Datensätze ab, die ich gleich wegwerfe" Abfragen...

alcaeus 16. Sep 2005 14:14

Re: Firebird und LIMIT bei SELECT
 
Ich glaube wir reden ein klein bisschen aneinander vorbei, ich hole mal etwas weiter aus.
In den verschiedenen Dateien des phpBBs werden die Queries so ausgefuehrt:
Code:
$sql = "SELECT * FROM sometable ORDER BY id ASC LIMIT 15,15;
if (!($result = $db->sql_query($sql)))
{
//...
}
$db ist dabei ein Objekt von sql_db, einer Klasse die je nach eingestelltem DBMS anders definiert ist. Ich baue eben eine neue sql_db-Klasse, also weiss ich momentan nicht wie ich da mit einer selecteable Procedure arbeiten soll.
In meiner sql_query spalte ich das uebergebene Query mit einer RegExp ausseinander um Limit und Start zu erhalten, und setze dann das neue Query zusammen. Die Frage ist nur, ob ich im obigen Fall das:
SQL-Code:
SELECT FIRST 15 SKIP 14...
oder das:
SQL-Code:
SELECT FIRST 15 SKIP 15...
schreiben muss :gruebel:

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.

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