Hilfe bei einer Abfrage

svart

Benutzer
Beiträge
5
Ich möchte gerne eine Abfrage erstellen und habe etwas Probleme damit, ich hoffe ihr könnt mir helfen.

Aus den 2 Tabellen (vereinfacht als Beispiel) möchte ich gerne für jeden Vorgang in Tabelle "tbl_vorgang" folgende Daten haben:

in Tabelle "tbl_tasks" befinden sich meherere Tasks zum Vorgang, hier möchte ich für alle Vorgänge mit Wert done = 0 nur den Task mit dem frühesten Datum haben, also max(date) - leider spuckt mir meine Abfrage alle Tasks aus.

Meine Abfrage:

Select v.id
v.creation_date,
v.modification_date,
v.number,
tbl_tasks.text,
(select max(tbl_tasks.date) from tbl_tasks where tbl_tasks.vorgangsid = v.id)
from tbl_vorgang v
where v.done = '0'
Beispieltabellen:

tbl_vorgang
id creation_date modification_date number
1 2015-02-27 2015-02-28 8
2 2016-04-20 2016-04-21 9


tbl_tasks
id date text vorgangs_id task_id
1 2016-03-29 Aufgabe1 1 2
2 2016-03-29 Aufgabe2 1 3
3 2016-04-01 Aufgabe3 1 1
4 2016-04-06 Aufgabe1 2 1
5 2016-04-07 Aufgabe2 2 4



Foglendes möchte ich gerne erhalten:

v.id v.creation_date v. modification_date v.number tbl_tasks.text tbl_tasks.date
1 2015-02-27 2015-02-28 8 Aufgabe3 2016-04-01
2 2016-04-20 2016-04-21 9 Aufgabe2 2016-04-07
 
Zuletzt bearbeitet:
Werbung:
Da gibt es mehrere Wege, leider keinen so wirklich komfortablen bei MSSQL. Hier ein Beispiel:
Code:
SELECT   v.id,
     v.creation_date,
     v.modification_date,
     v.number,
     t.[date],
     t.[text]
FROM   tbl_vorgang v
LEFT JOIN (

SELECT   ROW_NUMBER() OVER (PARTITION BY vorgangsid ORDER BY [date] DESC) AS zeile,
     vorgangsid,
     [date],
     [text]
FROM   tbl_tasks

     ) t
ON     t.vorgangsid = v.id
AND     t.zeile = 1
WHERE   v.done = '0'
 
Vielen Dank für die schnelle Hilfe.
Das klappt sehr gut.

Gibt es denn für Access eine einfachere Lösung diese Abfrage zu gestalten?
Eigentlich will ich die Abfrage in Access bauen, nur da stand ich vor dem selben Problem des nicht-wissens :(
 
Gibt es denn für Access eine einfachere Lösung diese Abfrage zu gestalten?

Ich glaube nicht. Die gezeigte Lösung ist relativ okay. Evtl. könnte man im Subselect schon weiter die Ergebnissmenge reduzieren mit einem weiteren Subselect, welches nur die row_number=1 filtert, und damit dann joint.

In PG würde ich DISTINCT ON (...) nutzen, das wäre in der Tat effektiver. Allerdings ist das eine reine PG-Lösung, da nicht SQL-konform, und das kann auch nur PG.
 
Werbung:
In Access würde z.B. das hier gehen:
Code:
SELECT   v.id,
     v.creation_date,
     v.modification_date,
     v.number,
     t1.[date],
     t2.[text]
FROM   tbl_vorgang v
LEFT JOIN (

SELECT   vorgangsid,
     max([date]) AS [date]
FROM   tbl_tasks
GROUP BY vorgangsid

     ) t1
ON     t1.vorgangsid = v.id
LEFT JOIN tbl_tasks t2
ON     t2.vorgangsid = v.id
AND     t2.[date] = t1.[date]
WHERE   v.done = '0'
Nachteil: Wenn in tbl_tasks mehrere Datensätze mit dem selben [date] stehen werden auch mehrere angezeigt. Dürfte aber für Access die "sauberste" Variante sein.
 
Zurück
Oben