Hallo zusammen,
ich habe folgendes Szenario: Eine Stammdaten-Tabelle mit Benutzern, die Aktionen ausführen können, und eine Tabelle mit konkreten, ausgeführten Aktionen dieser Benutzer mit der Fremdschlüssel-Beziehung, dass jede Aktion zu genau einem Benutzer gehört. Vereinfacht:
BENUTZER(id NUMBER, name VARCHAR(30))
AKTION(id NUMBER, ben_id NUMBER, zeitpunkt DATE, beschreibung VARCHAR(30), ...noch ein paar weitere Spalten)
Mein Ziel ist nun, mit einer Abfrage alle Benutzer zusammen mit Zeitpunkt und Beschreibung ihrer aktuellsten Aktion zu erhalten. Falls ein Benutzer noch keine Aktion ausgeführt hat, sollen Nullwerte verwendet werden. Es sollte examplarisch also etwa so aussehen (zeigt Benutzer 4711 und 42 mit ihren zuletzt ausgef. Aktionen, Benutzer 23 ist noch ohne Aktion):
Spalten: (Benutzer.id, Benutzer.name, Aktion.zeitpunkt, Aktion.beschreibung)
[tab](4711, Peter, 01.08.2005 11:12, Neue Aktion)[/tab]
[tab](42, James, 22.07.2005 22:30, Andere Aktion)[/tab]
[tab](23, LazyJoe, NULL, NULL)[/tab]
Ich kann dieses Problem lösen: mit UNION, das die Menge der Benutzer mit bereits mind. einer Aktion vereint mit der Menge von Benutzern ohne Aktionen.
Meine Frage ist jetzt, ob es für dieses nicht außergeöhnliche Problem nicht eine elegantere/perfomantere Lösung gibt?!
Hier ist die Abfrage:
Für Ideen dazu sehr dankbar...
Gruß
Jan
ich habe folgendes Szenario: Eine Stammdaten-Tabelle mit Benutzern, die Aktionen ausführen können, und eine Tabelle mit konkreten, ausgeführten Aktionen dieser Benutzer mit der Fremdschlüssel-Beziehung, dass jede Aktion zu genau einem Benutzer gehört. Vereinfacht:
BENUTZER(id NUMBER, name VARCHAR(30))
AKTION(id NUMBER, ben_id NUMBER, zeitpunkt DATE, beschreibung VARCHAR(30), ...noch ein paar weitere Spalten)
Mein Ziel ist nun, mit einer Abfrage alle Benutzer zusammen mit Zeitpunkt und Beschreibung ihrer aktuellsten Aktion zu erhalten. Falls ein Benutzer noch keine Aktion ausgeführt hat, sollen Nullwerte verwendet werden. Es sollte examplarisch also etwa so aussehen (zeigt Benutzer 4711 und 42 mit ihren zuletzt ausgef. Aktionen, Benutzer 23 ist noch ohne Aktion):
Spalten: (Benutzer.id, Benutzer.name, Aktion.zeitpunkt, Aktion.beschreibung)
[tab](4711, Peter, 01.08.2005 11:12, Neue Aktion)[/tab]
[tab](42, James, 22.07.2005 22:30, Andere Aktion)[/tab]
[tab](23, LazyJoe, NULL, NULL)[/tab]
Ich kann dieses Problem lösen: mit UNION, das die Menge der Benutzer mit bereits mind. einer Aktion vereint mit der Menge von Benutzern ohne Aktionen.
Meine Frage ist jetzt, ob es für dieses nicht außergeöhnliche Problem nicht eine elegantere/perfomantere Lösung gibt?!
Hier ist die Abfrage:
Code:
SELECT b.name, a.id, a.zeitpunkt
FROM aktion a, benutzer b
WHERE a.ben_id = b.id
AND a.zeitpunkt =
(select max(a2.zeitpunkt) from aktion a2 where a2.ben_id = b.id)
UNION
SELECT b.name, to_number(null), to_date(null)
FROM benutzer b
WHERE NOT EXISTS(
select *
FROM aktion a
WHERE a.ben_id = b.id
)
ORDER BY 1;
Für Ideen dazu sehr dankbar...
Gruß
Jan