Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Suche Sub-Select-Abfrage (https://www.delphipraxis.net/179550-suche-sub-select-abfrage.html)

Matze 14. Mär 2014 15:22

Datenbank: SQLite • Version: 3 • Zugriff über: C#

Suche Sub-Select-Abfrage
 
Hallo zusammen,

ein besserer Titel ist mir leider nicht eingefallen.

Ich habe folgende Tabellen in meiner Datenbank:

Tabelle 1 (Parameter):
Code:
Datum (double) | Wert A | Wert B | ...
Tabelle 2 (Prüfungen):
Code:
Datum (double) | Wert C | Wert D | ...
In Tabelle 1 stehen gelegentlich Einträge drinnen. In meinem Fall Änderungen verschiedener Parameter für Prüfungen.
In Tabelle 2 stehen die Prüfungsergebnisse: pro Ergebnis eine Zeile.

Beispiel (das Datum habe ich als Double-Wert gespeichert, aber ich verwende zum Verständnis hier einen String):

Tabelle 1 (Parameter):
Code:
14.03.14, 07:23:10 | 1,2 | 2,2 | ...
14.03.14, 07:27:14 | 1,4 | 2,4 | ...
14.03.14, 07:35:05 | 1,3 | 2,3 | ...
Tabelle 2 (Prüfungen):
Code:
14.03.14, 07:23:10 | Test 1 | ...
14.03.14, 07:23:11 | Test 2 | ...
14.03.14, 07:23:12 | Test 3 | ...
...
14.03.14, 07:27:15 | Test 1 | ...
...
Nun möchte ich eine Abfrage, die mir beide Tabellen wie folgt zurückgibt. Zur Prüfung (Test 1, Test 2, ...) soll immer das am nächsten in der Vergangenheit liegende Datum herangezogen werden:
Code:
14.03.14, 07:23:10 | Test 1 | 1,2 | 2,2 | ...
14.03.14, 07:23:11 | Test 2 | 1,2 | 2,2 | ...
14.03.14, 07:23:12 | Test 3 | 1,2 | 2,2 | ...
...
14.03.14, 07:27:15 | Test 1 | 1,4 | 2,4 | ...
...
Wie funktioniert das genau?

Grüße
Matze

Hansa 14. Mär 2014 15:25

AW: Suche Join-Abfrage
 
Sieht schwer nach Kreuz/Pivottabelle aus. Aber : ohne Gewähr. :shock:

himitsu 14. Mär 2014 15:32

AW: Suche Join-Abfrage
 
Zitat:

soll immer das am nächsten in der Vergangenheit liegende Datum herangezogen werden
Klingt eher nach einem Sub-Select, anstatt nach einem Join?

Ein Select auf alle Daten die älter oder gleich alt sind, das Neuste als Erstes und dann ein Limit 1 darauf.

p80286 14. Mär 2014 15:40

AW: Suche Join-Abfrage
 
Wenn ich jetzt wüßte worauf Du hinaus willst, und die Daten sind irgendwie auch nicht soo optimal
ins unreine gedacht

Code:
select wasimmerduwillst
from tab1 join tab2 on (tab1.datum=tab2.datum)
     join (select max(tab1.datum) dasdatum from tab1 group by FeldX) Mytab on (mytab.dasdatum=tab1.datum)
So ungefähr müßte es gehen, ich hoffe daß ich Dich richtig verstanden habe.

Gruß
K-H

Furtbichler 14. Mär 2014 16:34

AW: Suche Join-Abfrage
 
Mein Beitrag:

Code:
select t.Datum, p.TestName, t.Daten....
  from Pruefungen p
       cross join Parameter t
 where t.Datum = (select MAX(datum) from Parameter x where x.Datum < p.Datum)
Auf Deutsch:
Gib mir für jede Prüfung den Parametersatz, dessen Datum dem Maximum aller Parametersätze entspricht, die vor der Prüfung liegen.

Achtung: Bei zwei Parametersätzen mit gleichem Zeitstempel bekommst Du auch zwei Zeilen.

Alternative Schreibweise:
Code:
select t.Datum, p.TestName, t.Daten....
  from Pruefungen p
     , Parameter t
 where t.Datum = (select MAX(datum) from Parameter x where x.Datum < p.Datum)

Matze 16. Mär 2014 07:45

AW: Suche Join-Abfrage
 
Hallo zusammen,

vielen Dank! :thumb:
Ich werde beide Varianten ausprobieren. In den kommenden 2 Wochen werde ich nicht dazu kommen, aber danach melde ich mich.

Zitat:

Zitat von Furtbichler (Beitrag 1252038)
Achtung: Bei zwei Parametersätzen mit gleichem Zeitstempel bekommst Du auch zwei Zeilen.

Das dürfte nicht vorkommen, da ich auch die Millisekunden abspeichere und das Speichern vom Benutzer ausgelöst wird. Sonst nehme ich ein "LIMIT 1" ins Sub-Query und dann wird eben eines der beiden Datensätze verwendet.

Stimmt, ein Sub-Select wäre vermutlich das richtige. Ich korrigiere das im Titel.

Grüße
Matze


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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