Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#1

Firebird View inner join

  Alt 28. Jul 2013, 17:06
Datenbank: Firebird • Version: 2.5 • Zugriff über: IbDac
Hallo Fachleute,

ich muß ein wenig ausholen, um mein kleines Problem zu schildern:

Gegeben ist eine Firebird-Datenbank mit einer Log-Tabelle. In dieser Tabelle gibt es einmal eine Spalte Benutzer, die einen Index auf den Benutzernamen (IDX_BENUTZER) der Tabelle BENUTZER enthält. Dann gibt es in der Log-Tabelle aber noch eine weitere Spalte, die ebenfalls einen Index auf den Benutzernamen der Tabelle BENUTZER enthält. Etwas anschaulicher:
Code:
Tabelle USER_LOG

   IDX_USER_LOG : Integer (Autowert)
   BENUTZER     : INTEGER;
   ZIELUSER     : INTEGER;
... und noch ein paar weitere Spalten, die hier aber nicht relevant sind ...
In den beiden Spalten sind logischerweise auch verschiedene Indizes abgelegt (nicht immer, aber immer öfter).

Für des Administrators Überblick benötige ich eine Grid-Darstellung, in der nicht nur die Benutzer-Indizes dargestellt werden, sondern die Benutzernamen. Die holte ich mir via Lookupfeld aus der Benutzertabelle:
Code:
Tabelle BENUTZER

   IDX_BENUTZER : Integer (Autowert)
   B_NAME       : VarChar(30)
... und noch ein paar weitere Spalten, die ebenfalls nicht relevant sind ...
Da der Administrator seine Log-Tabelle auch sortieren können möchte, treten erhebliche Verzögerungen auf, wenn nach einem der Lookup-Felder sortiert werden muß. Als Lösung habe ich mir ein View in der Datenbank erstellt und siehe da: die Sortierung ist nun erheblich schneller bei den Lookup-Feldern. Doch ein Problem gibt es bei diesem View noch immer: Ich kann zwar die Spalte BENUTZER joinen, nicht jedoch zusätzlich noch die Spalte ZIELUSER:
Code:
CREATE OR ALTER VIEW V_LOGS(
    L_INDEX,
    L_BENUTZER,
    L_PASS,
    L_AKTION,
    L_ZEIT,
    L_ZIEL)
AS
select
    USER_LOG.IDX_USER_LOG,
    BENUTZER.B_NAME,
    BENUTZER.B_PASS,
    AKTIONEN.AKTION,
    USER_LOG.AKTIONZEIT,
    USER_LOG.ZIELUSER

from USER_LOG
inner join BENUTZER on BENUTZER.IDX_BENUTZER = USER_LOG.BENUTZER
inner join AKTIONEN on AKTIONEN.IDX_AKTIONEN = USER_LOG.AKTION
;
So funktioniert das View, doch wird natürlich der Zieluser nur als Index angezeigt. Wenn ich statt der letzten Zeile im Select-Abschnitt statt USER_LOG.ZIELUSER noch einmal BENUTZER.B_NAME schreibe, erhalte ich zwar keine Fehlermeldung vom Firebird-Server, doch wird nun in der Spalte L_ZIEL der Wert der Spalte L_BENUTZER eingetragen, was logisch ist. Um das zu vermeiden, habe ich im From-Sektor des Vies noch diese Zeile eingefügt:
Code:
...
AS
select
    USER_LOG.IDX_USER_LOG,
    BENUTZER.B_NAME,
    BENUTZER.B_PASS,
    AKTIONEN.AKTION,
    USER_LOG.AKTIONZEIT,
    BENUTZER.B_NAME

from USER_LOG
inner join BENUTZER on BENUTZER.IDX_BENUTZER = USER_LOG.BENUTZER
inner join BENUTZER on BENUTZER.IDX_BENUTZER = USER_LOG.ZIELUSER
inner join AKTIONEN on AKTIONEN.IDX_AKTIONEN = USER_LOG.AKTION
;
Das erzeugt diese Fehlermeldung:
Code:
Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Ambiguous field name between table BENUTZER and table BENUTZER .
IDX_BENUTZER.
Nun meine Frage: Gibt es eine Möglichkeit, in der Spalte L_ZIEL den richtigen Benutzernamen anzuzeigen? Beim Sortieren nach dem Feld Zieluser tritt nämlich wieder die altbekannte Verzögerung auf, da ich im DBGrid hier natürlich wieder ein Lookup-Feld verwenden muß.
  Mit Zitat antworten Zitat