Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird - SELECT mit MAX / MIN Abfrage der gefundenen IDs (https://www.delphipraxis.net/129778-firebird-select-mit-max-min-abfrage-der-gefundenen-ids.html)

Tempdir 25. Feb 2009 12:12

Datenbank: Firebird • Version: 2.1 • Zugriff über: IB-Komponenten

Firebird - SELECT mit MAX / MIN Abfrage der gefundenen IDs
 
Hallo,

ich versuche gerade in Firebird eine Query zu bauen, welche von den gefundenen Datensätzen nur denjenigen ausgibt, dessen Primärschlüssel am kleinsten ist. Also in der Art etwa:

SQL-Code:
SELECT * FROM tabelle WHERE FIELD2='TRUE' AND FIELD1=MIN(FIELD1);
In der Anleitung hab ich das gefunden: Anelitung Firebird MAX/MIN aber ich bekomme es einfach nicht hin.

Zwar könnte ich folgendes machen:

SQL-Code:
SELECT MIN(FIELD1) FROM tabelle WHERE FIELD2='TRUE';
und danach dann nochmal eine Query, aber vielleicht ist da die Performance schlechter? Würde gerne die andere Möglichkeit testen.

Besten Dank!!

Billa 25. Feb 2009 12:17

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Vielleicht: "Select first 1 * from tabelle where field2 = 'TRUE' order by field1" ?

Tempdir 25. Feb 2009 12:20

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Wow DANKE! Das klappt und scheint sehr flott zu sein.

Gibts noch schnellere Alternativen?

Billa 25. Feb 2009 12:22

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Index auf Field1?

DeddyH 25. Feb 2009 12:26

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Sind Primärschlüssel nicht automatisch indexiert?

Tempdir 25. Feb 2009 12:26

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Ja - Primärschlüsselindex wurde bei mir automatisch ein Index erstellt. Bei FIELD2 hab ich auch einen erstellt.

Billa 25. Feb 2009 12:30

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Nützlicher als ein Index auf ein Boolsches Field2 (Selektivität = 0.5) ist sicherlich der Index auf Field1

Tempdir 25. Feb 2009 12:38

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Dem stimme ich zu, ich hab nur folgendes Problem:

Meine Tabelle enthält insgesamt 45 Spalten. Für meine Abfrage benötige ich allerdings nur FELD1 (=der Primärschlüssel, der kleinste) und FELD2 (= ein Flag, welches anzeigt ob der Datensatz schon bearbeitet wurde).

Meine Abfragen wurden deutlich schneller, als ich für FELD2 einen Index erstellt habe. Es ist übrigens ein VARCHAR(1) Feld, anscheinend gibt es keine Boolean-Felder in Firebird?

DeddyH 25. Feb 2009 12:42

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Man kann sich aber eine Boolean-Domäne definieren.

Billa 25. Feb 2009 12:46

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Verstanden... Ich benutze statt Boolscher Felder ohnehin immer Integer (für den Fall, daß da nachher doch noch andere Werte vorkommen könnten, nobody is perfect ;) .. und wer denkt schon zur Designzeit an wirlich Alles?) Trotzdem wirkt ein Index erst richtig gut, wenn die Selektivität möglichst niedrig wird. Selektivität ist 1 geteilt durch die Zahl der möglichen Werte. Bei nur zwei möglichen Werten ist der Nutzen nicht soooo gigantisch...

mkinzler 25. Feb 2009 12:47

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Ich würde dann aber einen SmallInt nehem und keine Char
Btw: Warum ein VarChar(1)?

Tempdir 25. Feb 2009 12:52

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Ok, das war nur für Testzwecke. Danke für den Hinweis!

Billa 25. Feb 2009 12:57

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Noch ein kleiner Vorteil bei der Verwendung von Integer: die können später auch prima als Fremdschlüssel benutzt werden. Und sie sind nicht Zeichensatzabhängig ... Ich empfinde das "Fehlen" von Boolschen Feldern nicht als Nachteil. Aber das ist natürlich nicht zuletzt Geschmackssache...

Tempdir 25. Feb 2009 13:01

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Danke!

Zum Thema "Boolean-Domäne": Bringt das Vorteile?

DeddyH 25. Feb 2009 13:04

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Natürlich. Du kannst z.B. Werte checken und hast DB-einheitlich dieselben Grundlagen. Sollten sich diese ändern, musst Du nur die Domäne anpassen.

Billa 25. Feb 2009 13:07

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Grundsätzlich bringt das den Vorteil der leichteren Wart- und Lesbarkeit.
Einer Domäne kann man Bedingungen und Einschränkungen mitgeben.
Damit können schon beim Design falsche Feldinhalte vermieden werden.
Ausserdem kann man bei manchen System im Nachhinein den Datentyp einer
Domäne ändern. Also alle Felder auf einen Schlag!

Tempdir 16. Mär 2009 08:56

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Guten Morgen,

meine Frage betrifft das gleiche Problem wie hier diskutiert, allerdings diesmal für die Turbo-Datenbank (TurboDB).

Ich spreche meine Turbo-Datenbank mit den Delphi "TurboDB"-Komponenten an, unter anderem ein TDBQuery. Als SQL-Syntax gibt es anscheinend nur Local-SQL (wie auch immer die aussieht, finde leider keine Doku dazu).

Frage: Wie mache ich so eine Anfrage, damit sie auch mit der TDBQuery-Komponente und der TurboDB funktioniert:

SQL-Code:
SELECT first 1 * FROM tabelle WHERE field2 = 'TRUE' order by field1

Wäre für Tipps wie immer sehr dankbar!

DeddyH 16. Mär 2009 09:02

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Evtl. so?
SQL-Code:
SELECT * FROM tabelle
WHERE field1 =
   (SELECT MIN(field1)
    FROM Tabelle
    WHERE field2 = 'TRUE')

Tempdir 16. Mär 2009 09:28

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Danke! Hab ich leider nicht zum Laufen bringen können, aber hab mittlerweile eine andere Lösung:

SQL-Code:
SELECT MAX(field1) FROM tabelle WHERE field2='TRUE'
Das doofe dabei, ich muss nochmal eine Anfrage starten um den Datensatz auszulesen. Kann man das auch in einem Zug machen wie in meinem vorherigen Beispiel oben? Es sollte halt am Ressourcenschonendsten sein.

DeddyH 16. Mär 2009 09:44

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
SQL-Code:
SELECT field1, <Feldliste>
FROM Tabelle
WHERE field2='TRUE'
GROUP BY field1, <Feldliste>
HAVING field1 = MAX(field1)

Tempdir 16. Mär 2009 10:24

Re: Firebird - SELECT mit MAX / MIN Abfrage der gefundenen I
 
Danke das klappt sehr gut :)


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

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