SELECT-Problem
Tom2
- datenbank
0 Alexander Foken0 Tom2
0 sky.connect0 Tom2
Hallo liebe SQLer
Ich stehe vor einem Problem, dass mich (und mein Access 97[1]) an die Grenze treibt. Zuerst einmal zum DB-Design:
Ich habe eine Tabelle (RANGE), die aktuelle Daten speichert. In einer zweiten Tabelle (JOURNAL), die genau die gleichen Felder wie RANGE und ein paar zusätzliche hat, werden alle Änderungswünsche aufgenommen. Falls ein Änderungswunsch ok ist wird der entsprechende Datensatz in RANGE angepasst und im Datensatz in JOURNAL ein Flag (DONE) gesetzt. Ein wenig vereinfacht sieht das folgendermassen aus:
RANGE {pk_id,daten}
JOURNAL {pk_id,fk_rangeid,daten,done}
Jetzt brauche ich alle aktuellen Daten und den pk_id aus JOURNAL zu den aktuellen Daten. Die aktuellen Daten in JOURNAL sind die mit gesetzem DONE-Flag und der höchsten ID.
Fehlgeschlagene Versuche:
SELECT PK_ID,FK_RANGEID,DATEN FROM JOURNAL WHERE DONE=TRUE;
schlägt fehl, weil ich alle je dagewesenen Zustände der einzelnen Datensätze in RANGE zurückbekomme.
SELECT JOURNAL.PK_ID,RANGE.PK_ID,RANGE.DATEN
FROM RANGE LEFT JOIN JOURNAL ON RANGE.PK_ID = JOURNAL.FK_RANGEID;
liefert (wie auch INNER, RIGHT-JOIN und der vorherige SQL-Query) wieder alle Datensätze aus JOURNAL zurück.
Mit GROUP BY hab ich's auch versucht, aber dabei kommt auch nichts schlaues raus.
Wie kann ich jetzt entweder die beiden Tabellen richtig verbinden oder nur die Datensätze mit der höchsten ID aus JOURNAL ausgeben? Oder gibt es eine komplett andere Lösung?
Die einzige Lösung, die ich bis jetzt gefunden habe, ist pro Datensatz ein weiteres SELECT-Statement abzuschicken. Aber dies scheint mir Definition Schwachsinn zu sein ;-).
MfG und besten Dank
Tom2
[1] Es handelt sich um eine Access 97-Datenbank, auf die per ODBC und ASP zugegriffen wird.
Moin Moin !
Jetzt brauche ich alle aktuellen Daten und den pk_id aus JOURNAL zu den aktuellen Daten. Die aktuellen Daten in JOURNAL sind die mit gesetzem DONE-Flag und der höchsten ID.
SELECT ... FROM JOURNAL WHERE DONE=TRUE AND ID=SELECT MAX(ID) FROM JOURNAL [ und evtl. noch: ] WHERE DONE=TRUE
Das sollte funktionieren.
Alexander
Hi Alexander
SELECT ... FROM JOURNAL WHERE DONE=TRUE AND ID=SELECT MAX(ID) FROM JOURNAL [ und evtl. noch: ] WHERE DONE=TRUE
Ein SELECT PK_ID,FK_RANGEID,DATEN FROM JOURNAL WHERE PK_ID=(SELECT MAX(PK_ID) FROM JOURNAL); gibt mir nur den neusten Änderungswunsch, bzw. mit dem DONE=TRUE den neusten aktuellen Datensatz zurück. Ich brauche jedoch alle aktuellen Datensätze.
Knifflig, knifflig, und unser DB-Spezi sitzt jetzt wohl gerade am Frühstückstisch am anderen Ende der Welt (bei mind. 20° C und herrlichem Sonnenschein). :-/
Subselects sind aber eine gute Idee. Ich denke, dass ich damit weiter komme.
Besten Dank und MfG
Tom2
Hi,
ich hoffe, ich hab Dich richtig verstanden, dann müsste es so gehn:
select r.pk_id, r.pk_daten, j.pk_id, j.daten
from range r , journal j where r.pk_id = (select max(j.pk_id) from journal j where done = true) group by r.pk_id
gruss
sky.connect
Hi sky.connect
ich hoffe, ich hab Dich richtig verstanden, dann müsste es so gehn:
select r.pk_id, r.pk_daten, j.pk_id, j.daten
from range r , journal j where r.pk_id = (select max(j.pk_id) from journal j where done = true) group by r.pk_id
Das funktioniert nicht, weil dadurch nicht klar ist, von welchem Datensatz daten stammen soll. Das müsste auch der aktuellste sein.
Trotzdem Danke
Tom2