![]() |
SQL Abfrage
Hallo,
ich möchte gern in einer Datenbank nach einem Wert suchen lassen, ist er vorhanden, soll der Datensatz als auch der dem Wert entsprechende vorhergehende als der Nachfolger angezeigt werden. Wenn der Wert nicht gefunden wird, sollen aber auch Vorgänger und Nachfolger angezeigt werden. Zur Verfügung hab ich MSSQL und DelphiADO Zur Erklärung: Meine DB sieht etwas so aus: ID Wert 1 10 2 20 3 30 4 50 5 40 6 60 Ich kann also nicht einfach sagen: "Suche Wert, nimm DS mit ID+/-1" Ich muß quasi erstmal meine Daten sortieren, dann suchen und dann das Umfeld ausgeben lassen. Nur wie? |
Re: SQL Abfrage
Zitat:
SQL-Code:
Syntax ohne Gewähr. "Between" auch. :mrgreen:
SELECT * FROM BLA WHERE ID BETWEEN (:ID-1 AND ID+1);
|
Re: SQL Abfrage
Zitat:
Macht aber nichts, soweit war ich vor ein paar Wochen schon. Da find ich schon eine andere Lösung, so wie damals. |
Re: SQL Abfrage
naja, deine sql abfrage müsste dann einfach alles abfragen und sortiert zurück geben
SQL-Code:
mit TQuery.First, TQuery.Next etc. kannst du dann die ergebnisse durchgehen und nach deinem wert suchen. Wenn du diesen gefunden hast kannst du mit TQuery.Next den nachfolgenden Wert ermitteln und mit TQuery.Prior den davor liegenden Wert. Ob TQuery in Zusammenhang mit Ado geht weiß i leider nicht aber da wirds mindestens ähnliche Wege geben.
select * from YOURTABLE order by ID ASC
|
Re: SQL Abfrage
Zitat:
|
Re: SQL Abfrage
Das sollte man auch hinn bekommen. Wenn du die Abfrage durchgeführt hast (muss nichtmal sortiert sein) dann kannst du die ergebnisse ja einfach durchgehen und danach suchen.
Delphi-Quellcode:
Das ganze ist nur PseudoCode der veranschaulichen soll wie das ganze funktioniert, kann also nicht eins zu eins abgetippt werden und soll somit auch nur als denkanstoß dienen (hoffe ich hab kein Denkfehler dabei)
var LDavor, LDahinter, LTreffer, LCount: Integer;
begin LDavor := -1; LDahinter := -1; LTreffer := -1; for LCount := 0 to GefundeneDatensaetze.count - 1 do begin if (LDavor = -1) or ((GefundeneDatensaetze[LCount].ID > LDavor) and (GefundeneDatensaetze[LCount].ID < GesuchteID)) then LDavor := GefundeneDatensaetze[LCount].ID; if (LDahinter = -1) or ((GefundeneDatensaetze[LCount].ID < LDahinter) and (GefundeneDatensaetze[LCount].ID > GesuchteID)) then LDahinter := GefundeneDatensaetze[LCount].ID; if GefundeneDatensaetze[LCount].ID = gesuchteID then LTreffer := gesuchteID; end; end; |
Re: SQL Abfrage
Hmm. Ich glaube Du bist zu sehr auf die ID fixiert. Die ID hilft mir nichts, da sie in keinem Zusammenhang mit den Werten steht, es mir aber um die Werte geht.
|
Re: SQL Abfrage
Dann musst du eben ID durch den anderen Spaltenwert ersetzen, es geht ja nur um das funktionsprinzip, das letztendliche proggen musst du eh selbst.
|
Re: SQL Abfrage
Zitat:
Dann kann ich aber wiederrum nicht mit +1 und -1 arbeiten. Ich schau mir grad eh eine SQL basierte Lösung an, damit ich das ganze auch gleich für ASP verwenden kann. |
Re: SQL Abfrage
Du mußt zuerst mal sagen, von welchem Kriterium es abhängt, was "davor" oder "dahinter" bedeutet. Wenn es sich nicht um die ID handelt, was dann ?
Zitat:
Ich will damit sagen, daß die Fragestellung so unpräzise ist, daß wohl niemand etwas damit anfangen kann. Wie es aussieht gilt das mittlerweile auch für die DB. 8) |
Re: SQL Abfrage
Zitat:
Zitat:
20 30 Wenn ich nun 25 habe, ist der nicht in der DB aber davor und danach gibt es was. Zitat:
Zitat:
|
Re: SQL Abfrage
Aha, deine Werte sind "Mess"werte. Wieso sagst du das nicht gleich ? 8)
Zitat:
|
Re: SQL Abfrage
Vielleicht funktioniert ja so etwas in der Art bei Dir: (konnte es nicht richtig ausprobieren, habe nur MySQL und das ist mit UNION und Sortierung überfordert und TOP muss mit LIMIT gemacht werden)
Code:
x ist der gesuchte Messwert.
(SELECT TOP 1 * FROM Messwerte WHERE (Wert<x) ORDER BY Wert DESC) UNION
(SELECT * FROM Messwerte WHERE (Wert=x)) UNION (SELECT TOP 1 * FROM Messwerte WHERE (Wert>x) ORDER BY Wert ASC); Gruß, teebee |
Re: SQL Abfrage
Zitat:
|
Re: SQL Abfrage
Zitat:
Gruß, Tom |
Re: SQL Abfrage
Moin Motu :hi:
Ich muss sagen, ich habe irgendwie nicht ganz kapiert worum es dir geht. :gruebel: Ist es so?
Code:
Das wäre würdest du so hinbekommen:
[b]Vorgäger Wert Nachfolger[/b]
<null> 1 2 1 2 3 2 3 4 3 4 5 4 5 <null>
SQL-Code:
SELECT Ref.DeinFeld As Val
,Tab1.DeinFeld As Pred ,Tab2.DeinFeld As Succ FROM DeineTabelle Tab1 ,DeineTabelle Tab2 ,DeineTabelle Ref WHERE Tab1.DeinFeld = Ref.DeinFeld - 1 And Tab2.DeinFeld = Ref.DeinFeld + 1 |
Re: SQL Abfrage
Ich habs mit MySQL gemacht und da gibt es kein TOP, da muss man es mit ORDERBY und LIMIT 'emulieren', Du kannst Dir das ORDERBY also tatsächlich sparen. Ein Statement, das auf jeden Fall funktioniert (habe es jetzt direkt im MySQL-Client getestet und nicht in MySQL-Front, was offensichtlich mit geklammerten Statements nicht klarkommt) ist dieses hier:
Code:
Gruß, teebee
(SELECT * FROM Messwerte WHERE (wert<x) ORDERBY wert DESC LIMIT 1) UNION
(SELECT * FROM Messwerte WHERE (wert=x)) UNION (SELECT * FROM Messwerte WHERE (wert>x) ORDERBY wert LIMIT 1); |
Re: SQL Abfrage
Zitat:
gesucht wird zu einem Messwert x dessen direkter kleinster und größter Nachbar. Bsp: Messwerte = (4,5,7,8,9,10). Mit x = 7 soll z.B. Folgendes ausgegeben werden: 5,7,8 x=6: 5,7 Gruß, Tom |
Re: SQL Abfrage
Moin, moin,
Zwischenfragen: Sind die Messwerte in einer zeitlichen Abfolge? Oder suchst Du nur die Wertmäßige Abfolge. Oder hast einen Wert µ um den du herum nur jeweils einen Wert suchst um diesen neu zu interpolieren ? Grüße // Martin |
Re: SQL Abfrage
Zitat:
Zitat:
Inzwischen habe ich mein Ziel allein durch Anpassung des SQL-Statements erreicht. Mal sehen, was als nächstes kommt. |
Re: SQL Abfrage
Also falls nochmal jemand wie ich hier her kommt, pack ich mal zwei Lösungen hier rein.
Die Erste gibt nur den Wert, sofern vorhanden, sowie den Vorgänger/Nachfolger aus. Da das die ASP-Source ist, müßte "&input1&" durch eine Variable ersetzt werden.
SQL-Code:
SELECT Spalten, MAX(wert) FROM Tabellen WHERE wert < "&input1&"
UNION SELECT Spalten FROM Tabellen WHERE wert = "&input1&" UNION SELECT Spalten, MIN(wert) FROM Tabellen WHERE wert > "&input1&" ORDER BY wert Die Zweite gibt 5 Vorgänger/Nachfolger aus:
SQL-Code:
SELECT Spalten
FROM Tabellen WHERE Wert IN (SELECT TOP 5 Wert FROM Tabelle WHERE Wert < "&input1&" ORDER BY Wert DESC) UNION SELECT Spalten FROM Tabellen WHERE Wert = "&input1&" UNION SELECT Spalten FROM Tabellen WHERE Wert IN (SELECT TOP 5 Wert FROM Tabelle WHERE Wert > "&input1&" ORDER BY Wert) ORDER BY Wert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 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 by Thomas Breitkreuz