Datensatzausgabe nach GROUP BY

Hallo,

ich habe noch ein Verhalten von MS Access festgestellt, das ich so nicht erwartet hätte. Das liegt wahrscheinlich an mangelnder Erfahrung, deshalb hoffe ich, dass ihr mir dabei schnell helfen könnt.

Ich habe z.B. zwei Tabellen. Eine „tbl_test“ mit Versuchsinformationen, wichtig ist nur die id. Und eine zweite „tbl_run“ mit Informationen zu den einzelnen Testläufen für jeden Versuch, wichtig sind Spalte „id“, „test_id“ (ein Feld das eine integer Referenz auf den zugehörigen Test speichert) und „run_nr“ (integer mit laufender Nummer des Runs pro Test).

tbl_test: 1 Datensatz
id=95

tbl_run: 2 Datensätze
id=38, test_id=95, run_nr=1
id=40, test_id=95, run_nr=2

Ich möchte eine Query erstellen, die mir die tbl_run.id des höchsten Laufs für jeden test ausgibt, sowie run_nr und test.id des zugehörigen Datensatzes. Mein Ansatz ist:

SELECT test.id, run.id, max(run_nr) as run_nr FROM tbl_test test
LEFT JOIN tbl_run run ON test.id=run.test_id GROUP BY test.id;

Access beschwert sich hier, dass ich „run.id“ weder in einer Aggregatfunktion noch hinter GROUP BY verwendet habe. In der online-Hilfe fand ich den Hinweis, dass jedes hinter SELECT angegebene Feld entweder Teil einer Aggregatfunktion oder GROUP BY sein muss, um Mehrdeutigkeiten auszuschließen.

Aber wenn ich 1. „run.id“ auch hinter GROUP BY aufliste, wird nicht mehr ein Ergebnis-Datensatz angezeigt, sondern zwei => die test.id ist nicht mehr zusammengefasst.

Wenn ich 2. schreibe „SELECT test.id, min(run.id) AS run_id, max(run_nr)…“,
Dann bekomme ich ein Ergebnisdatensatz mit test.id=95, run_id=38 und run_nr=2. Das ist aber eine Kombination aus dem ersten (run_id=38) und dem zweiten ge-join-ten Datensatz (test.id und run_nr).

Ich ging bislang immer davon aus, dass bei der Auswertung einer Query als erste alle Kombinationssätze des Joins erstellt und dann alle die eleminiert werden, die nicht zutreffen. Für 1. also:

  • das Join ergibt 2 Datensätze, einen für Run 1 und einen für Run 2
  • das GROUP BY test.id fasst beide zu einer Gruppe zusammen
  • as max(run_nr) wählt den Datensatz mit der höchsten Nummer aus
    Als Ergebnis hätte ich dann gern die run.id, die zu diesem ausgewählten Datensatz gehört.

Wie komme ich an dieses Feld? Ohne Aggregatfunktion?
Bitte kein Workaround wie „Wenn die Runs immer durchnummeriert werden, dann hat die höchste Run Nummer auch immer die höchste ID, also nimm einfach max“. Es geht um das Prinzip, dass ich an Felder komme, die zum Datensatz gehören.

Danke, Gruß,
Michael

Hallo,

tbl_test: 1 Datensatz
id=95

tbl_run: 2 Datensätze
id=38, test_id=95, run_nr=1
id=40, test_id=95, run_nr=2

Ich möchte eine Query erstellen, die mir die tbl_run.id des
höchsten Laufs für jeden test ausgibt, sowie run_nr und test.id
des zugehörigen Datensatzes.

Select * from tblRun
inner Join tblTest on tblRun.Test_ID = tblTest.ID
where tblRun.ID =
(
Select Top 1 temp.ID from tblRun as temp where temp.ID = tblRun.ID order by temp.ID Desc
)

Gruß
Franz, DF6GL

Hallo Franz,

Select * from tblRun
inner Join tblTest on tblRun.Test_ID = tblTest.ID
where tblRun.ID =
(
Select Top 1 temp.ID from tblRun as temp where temp.ID =
tblRun.ID order by temp.ID Desc
)

Danke sehr! Ich habe das von MySQL irgendwie einfacher in Erinnerung, aber ich werde es gleich morgen ausprobieren.

Gruß,
Michael

Hallo,

Select * from tblRun
inner Join tblTest on tblRun.Test_ID = tblTest.ID
where tblRun.ID =
(
Select Top 1 temp.ID from tblRun as temp where temp.ID =
tblRun.ID order by temp.ID Desc
)

Da stimmt etwas noch nicht ganz. Es muss

… tblRun.ID order by temp. run_nr Desc …

lauten…

Gruß
Franz, DF6GL