AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi InterBase-SQL ,SELECT -Anweisung
Thema durchsuchen
Ansicht
Themen-Optionen

InterBase-SQL ,SELECT -Anweisung

Ein Thema von jokriege · begonnen am 26. Feb 2004 · letzter Beitrag vom 27. Feb 2004
Antwort Antwort
jokriege

Registriert seit: 25. Feb 2004
Ort: Oldenburg
5 Beiträge
 
Delphi 7 Professional
 
#1

InterBase-SQL ,SELECT -Anweisung

  Alt 26. Feb 2004, 11:12
Hallo,

ich möchte folgende SQL-Abfrage (MS-SQL) mit InterBase umsetzen:
Suche (blockanfang und kennung) in der Tabelle nach dem ersten Wert in der Spalte
blockende, der größer als eine Nummer (z. B. 421890763500000) ist.
Das geht beim MS-SQL-Server so:

select top 1 blockanfang, kennung from [tabelle] where blockende >= 421890763500000

Leider habe ich bisher keine Möglichkeit beim IB-Server gefunden.
Kennt jemand eine Lösung?

Vielen Dank vorab für eine Antwort.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#2

Re: InterBase-SQL ,SELECT -Anweisung

  Alt 26. Feb 2004, 11:17
Das Einschränken der Datensätze in der Ergebnismenge ist für jede DB anders (ist auch nicht Teil vom ANSI-SQL-Standard)
In Oracle wär's:
SQL-Code:
SELECT BlockAnfang,
       Kennung
FROM tabelle
WHERE BlockEnde >= 421890763500000 And
       RowNum = 1
Der MS SQL Svr hat sein Top und ich habe auch schon solche Sachen gesehen:
SQL-Code:
SELECT BlockAnfang,
       Kennung
FROM tabelle
WHERE BlockEnde >= 421890763500000
LIMIT 1
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#3

Re: InterBase-SQL ,SELECT -Anweisung

  Alt 26. Feb 2004, 12:15
Hmm - so:
SQL-Code:
SELECT *
  FROM tabelle
 WHERE BlockEnde = ( SELECT min(BlockEnde)
                       FROM tabelle
                      WHERE BlockEnde >= 421890763500000)
?
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#4

Re: InterBase-SQL ,SELECT -Anweisung

  Alt 26. Feb 2004, 12:35
interbase kennt von hause aus sowas nicht,
muesste man in einer SP dort machen

die SP in interbase wuerde etwa so aussehen
Code:
CREATE PROCEDURE GET_FIRST_VALUE_BLOCKENDE (
    INPUT_VALUE INTEGER
   )
RETURNS (
    OUT_BLOCKANFANG INTEGER,
    OUT_KENNUNG VARCHAR(10))
AS
DECLARE VARIABLE HA INTEGER;
DECLARE VARIABLE HB VARCHAR(10);
BEGIN
  HA = -1;
  HB = '';
  OUT_BLOCKANFANG = -1;
  OUT_KENNUNG = '';
  FOR SELECT B.BLOCKANFANG, B.KENNUNG FROM
  BLOCK B
  WHERE (B.BLOCKENDE >= :INPUT_VALUE)
  ORDER BY B.BLOCKANFANG
  INTO :HA, :HB
  DO
  BEGIN
    IF (:HA <> -1) THEN
       OUT_BLOCKANFANG = :HA;
    IF (:HB <> '') THEN
       OUT_KENNUNG = :HB;

    SUSPEND;
    EXIT;   // HIERDURCH NACH ERSTEN SATZ SP BEENDET
  END
  SUSPEND; // FUER DEN FALL DASS NICHTS GEFUNDEN WIRD
END
aber muss es unbedingt interbase sein, bei firebird wuerde es so gehen

select first 1 * from tabellenname
where ...
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#5

Re: InterBase-SQL ,SELECT -Anweisung

  Alt 26. Feb 2004, 12:37
@Leuselator
Man sollte für eine solche Einschränkungen neien StopKey verwenden (bei mir RowNum...)
Da bei deiner Variante ein zweiter kompletter Table access nötig war:


SQL-Code:
SELECT *
FROM XXXXXXXXX.sent_queries t
WHERE t.error_id >= 3000 And
       RowNum = 1
Optimizer plan:
Delphi-Quellcode:
SELECT STATEMENT, GOAL = CHOOSE CHOOSE SELECT STATEMENT
 COUNT STOPKEY STOPKEY COUNT
  TABLE ACCESS FULL XXXXXXXXX SENT_QUERIES FULL TABLE ACCESS

SQL-Code:
SELECT *
FROM XXXXXXXXX.sent_queries t
WHERE t.error_id = (SELECT Min(sq.error_id)
                     FROM XXXXXXXXX.sent_queries sq
                     WHERE sq.error_id >= 3000)
Optimizer plan:
Delphi-Quellcode:
SELECT STATEMENT, GOAL = CHOOSE CHOOSE SELECT STATEMENT
 FILTER FILTER
  TABLE ACCESS FULL XXXXXXXXX SENT_QUERIES FULL TABLE ACCESS
  SORT AGGREGATE AGGREGATE SORT
   TABLE ACCESS FULL XXXXXXXXX SENT_QUERIES FULL TABLE ACCESS
  Mit Zitat antworten Zitat
jokriege

Registriert seit: 25. Feb 2004
Ort: Oldenburg
5 Beiträge
 
Delphi 7 Professional
 
#6

Re: InterBase-SQL ,SELECT -Anweisung

  Alt 26. Feb 2004, 15:48
Vielen Dank für die schnellen Antworten.

Ich hab's.

Gruß
jokriege
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#7

Re: InterBase-SQL ,SELECT -Anweisung

  Alt 26. Feb 2004, 20:32
@Robert_G:
Das mein Vorschlag nicht gerade blitzschnell ist, war mir klar - allerdings ging ich 1. davon aus, das die ZielDB eben nichts derartiges anbietet und 2. (klammheimlich), dass die Werte in dem Feld BlockEnde unique sind

@jokriege:
Es ist mehr als recht und billig, die Forengemeinde an einer gefundenen Lösung teilhaben zu lassen - so können andere, die später mal ein ähnliches Problem wie Du haben, diese Lösung nachvollziehen und ev. für ihr Problem übernehmen. Also bitte: klär uns über Deine Lösung auf!
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
jokriege

Registriert seit: 25. Feb 2004
Ort: Oldenburg
5 Beiträge
 
Delphi 7 Professional
 
#8

Re: InterBase-SQL ,SELECT -Anweisung

  Alt 27. Feb 2004, 07:11
Hallo, ich habe die Lösungsvorschläge von Leuselator und DelphiDeveloper getestet:

Der Vorschlag von DelphiDeveloper liefert zwar das richtige Ergebnis ist aber wesentlich langsamer als die SELECT-Abfrage von Leuselator. Deshalb habe ich mich für die Lösung von Leuselator entschieden.

@Leuselator:
Sorry, dass ich es versäumt habe, die von mir verwendete Lösung mitzuteilen.

Zur allg. Info:
Meine DB enthält z. Zt. ca. 500.000 Datensätze und ich habe es mit bis zu 50 Anfragen pro Sekunde (TCP/IP -> Delphi-Applikation -> InterBase -> Delphi-Applikation -> TCP/IP) getestet. Es funktioniert zu meiner vollsten Zufiedenhheit.

Danke und Gruß
jokriege
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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