Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [SQL] Datensatz + vorigen/nächsten ermitteln (https://www.delphipraxis.net/98246-%5Bsql%5D-datensatz-vorigen-naechsten-ermitteln.html)

marabu 24. Aug 2007 09:46

Re: [SQL] Datensatz + vorigen/nächsten ermitteln
 
Hi Markus,

das kommt auf die Größe der Lücke an.

An welche Größe denkst du jetzt so?

Fröhliche Grüße

mkinzler 24. Aug 2007 09:53

Re: [SQL] Datensatz + vorigen/nächsten ermitteln
 
Jetzt hast du den Code ja korrigiert.

marabu 24. Aug 2007 10:07

Re: [SQL] Datensatz + vorigen/nächsten ermitteln
 
Hallo Markus,

bezog sich deine Frage tatsächlich auf "Abs(id - 5)"?

Die Fünf stammt aus dem Testlauf auf meiner Maschine und steht gewiss nicht für eine Lückengröße. Sie ist der Schlüssel, der mit seinen Nachbarn zusammen zurückgeliefert werden soll. Ich habe die Fünf analog zu meinem ersten Beitrag durch einen Parameter ersetzt. Die lustigere Frage wäre wohl gewesen: "Was wenn der gesuchte Schlüssel einmal nicht 5 ist?"

Der Abstand der Schlüssel spielt übrigens keine Rolle. Wäre er definiert, dann wäre das Problem für Matthias wohl gar nicht erst entstanden.

Freundliche Grüße

joachimd 24. Aug 2007 14:47

Re: [SQL] Datensatz + vorigen/nächsten ermitteln
 
Zitat:

Zitat von marabu
SQL-Code:
SELECT TOP 3 id
FROM tab
ORDER BY ABS(id - :id)

geht nicht! Beispiel (zB entsteht so etwas, wenn ein paar Datensätze gelöscht werden):

SQL-Code:
create table #tmp(id integer);
insert into #tmp values(1);
insert into #tmp values(5);
insert into #tmp values(6);
insert into #tmp values(7);
insert into #tmp values(10);
insert into #tmp values(15);
insert into #tmp values(20);

select top 3 id from #tmp ORDER BY ABS(id - 5);
Ergebnis: 5,6,7 -> 1,5,6 ist aber gewünscht (weil Vorgänger und Nachfolger von 5 gesucht sind)

marabu 24. Aug 2007 17:16

Re: [SQL] Datensatz + vorigen/nächsten ermitteln
 
Hallo Joachim,

du hast Recht, der Ansatz über die Distanz führt zu einem falschen Ergebnis, wenn die beiden Abstände zu den Nachbarn nicht gleich groß sind. Entweder der Vorgänger oder der Nachfolger müssen exakt bestimmt werden, sodass sich eine Subquery nicht vermeiden lässt:

SQL-Code:
/* MYSQL Syntax, ungetestet */

SELECT id
FROM tab
WHERE id >= (
  SELECT MAX(id)
  FROM tab
  WHERE id < :id
)
ORDER BY id
LIMIT 3
Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 Uhr.
Seite 2 von 2     12   

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