Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Problem bei der View

Dieses Thema im Forum "Oracle" wurde erstellt von flosharok, 10 Juli 2012.

  1. flosharok

    flosharok Neuer Benutzer

    Hallo zusammen,

    ich habe aktuell ein sql statement problem und komme nicht weiter.

    Ich habe eine Datenbankstruktur vorgegeben, die ich nicht ändern kann.
    Nun muss ich mit einer View auf die Daten zugreifen.

    Von der Tabellenstruktur sieht es folgendermaßen aus:
    Tabelle Auftrag
    ID
    Bezeichnung
    Typ ===> Intern / Extern
    Gruppe_ID
    . . . (weitere Werte)

    Tabelle Gruppe
    ID
    . . .

    Tabelle Bearbeitergruppe
    ID
    Gruppe_ID
    BearbeiterID_Extern
    BearbeiterID_Intern

    Tabelle Bearbeiter
    ID
    Name

    =========

    Meine View habe ich aktuell so zusammengestellt:


    select
    a.bezeichnung as A_Bezeichnung,
    Bextern.Name as Bearbeiter_Extern,
    Bintern.Name as Bearbeiter_Intern,
    BG.BearbeiterID_Extern as BearbeiterID_Ext,
    BG.BearbeiterID_Intern as BearbeiterID_Int
    FROM
    Auftrag as A
    left outer join Bearbeitergruppe as BG
    on BG.Gruppe_ID = A.Gruppe_ID
    left outer join Bearbeiter as Bextern
    on BG.BearbeiterID_Extern = Bextern.ID
    left outer join Bearbeiter as Bintern
    on BG.BearbeiterID_Intern = Bintern.ID

    =======
    als Daten bekomme ich dann z.B. folgendes raus:

    A_Bezeichnung | Bearbeiter_Extern | Bearbeiter_Intern | BearbeiterID_Ext | BearbeiterID_Int
    Aufrag1 Hans Mueller Joseph Schuber 1 2
    Auftrag1 Tim Schneider John Doe 3 4
    Auftrag2 Hans Mueller John Doe 1 4
    Auftrag3 Sepp Mair John Doe 5 4
    Aufrag3 Sepp Mair Joseph Schuber 5 2

    Was ich in meiner View noch nicht untergebracht habe ist die Unterscheidung des Auftragstyp.
    Ich habe leider keine Ahnung wie ich es realisieren kann.

    Ich möchte nämlich als Datensatz folgendes haben:


    A_Bezeichnung | Bearbeiter_Extern | Bearbeiter_Intern | B_ID_Ext | B_ID_Int | A_Auftragtyp
    Aufrag1 Hans Mueller Joseph Schuber 1 2 Intern
    Auftrag1 Tim Schneider John Doe 3 4 Intern
    Auftrag2 Hans Mueller John Doe 1 4 Intern
    Auftrag3 Sepp Mair John Doe 5 4 Extern

    Mit meiner View bekomme ich viele Datensätze, die exakt den gleichen Inhalt haben ausser die Kombination zwischen internen und externen Bearbeitern. Wobei dieser nur relevant ist, je nachdem welcher Auftragstyp eingetragen ist.
    In diesem Beispiel ist der 2. "Auftrag3" Eintrag irrelevant, da er ebenfalls für Extern gilt, aber der Datensatz sich nur beim Internen_Bearbeiter sich unterscheidet.

    Ich weiß nicht ob ich es mit meiner View realisieren kann.
    Kann mir jemand bitte einen Tipp geben wie ich da weiterkommen kann.

    Vielen Dank.

    Gruß
     
  2. ukulele

    ukulele Datenbank-Guru

    Also den Auftragstyp mit anzuzeigen sollte sehr leicht sein, einfach a.Typ im SELECT mit abfragen:
    Code:
    select
    a.bezeichnung as A_Bezeichnung,
    Bextern.Name as Bearbeiter_Extern,
    Bintern.Name as Bearbeiter_Intern,
    BG.BearbeiterID_Extern as BearbeiterID_Ext,
    BG.BearbeiterID_Intern as BearbeiterID_Int,
    a.Typ
    FROM
    Auftrag as A
    left outer join Bearbeitergruppe as BG
    on BG.Gruppe_ID = A.Gruppe_ID
    left outer join Bearbeiter as Bextern
    on BG.BearbeiterID_Extern = Bextern.ID
    left outer join Bearbeiter as Bintern
    on BG.BearbeiterID_Intern = Bintern.ID
    Der doppelte Interne Bearbeiter kommt durch deine Verschmelzung eines internen und eines externen Bearbeiters in eine Datensatzzeile. Gibt es jetzt 2 Interne Bearbeiter gibt es auch 2 Zeilen, wenn es auch noch 2 externe Bearbeiter gibt müssten es eigentlich schon 2*2=4 Zeilen werden. Wenn du nur eine Liste mit Bearbeitern zu jedem Auftrag haben willst, musst du die Abfrage eventuell anders aufbauen. Wie genau soll das Ergebniss denn aussehen?
     
    Walter gefällt das.
  3. flosharok

    flosharok Neuer Benutzer

    Hi,

    hmm, jo ich will genau eine Liste mit Bearbeitern zu jedem Auftrag und das halt abhängig vom Typ. Also wenn der Auftragstyp "extern" ist und zum Auftrag aber eine Bearbeitergruppe mit einem Internen und Externen Bearbeiter vorhanden ist. Soll nur der für extern angezeigt werden.

    Aktuell wird ja bei meiner View alles angezeigt.
     
  4. ukulele

    ukulele Datenbank-Guru

    Okay du willst für jeden Auftrag genau einen Bearbeiter sehen. Wenn es Intern und Extern gibt soll nur Extern angezeigt werden. Wenn es aber mehrere Externe gibt, wie soll dann der anzuzeigende Datensatz gewählt werden?
     
  5. flosharok

    flosharok Neuer Benutzer

    Jein.

    Ich möchte für den Auftrag genau einen Bearbeiter sehen, jedoch ist es abhängig vom Feld Typ in der Tabelle Auftrag.
    Wenn im Auftrag der Typ Extern eingetragen ist, soll der Datensatz nur für den Externen angezeigt werden, wenn es Intern ist, dann nur den für Intern.
     
  6. ukulele

    ukulele Datenbank-Guru

    Nach einem Knoten im Kopf hab ich mal dashier geschaffen, k.a. ob es funktioniert:

    Code:
    SELECT    tbl.A_Bezeichnung,
            tbl.BearbeiterID,
            ba.Name,
            tbl.BearbeiterTyp
    FROM    (    SELECT    a.bezeichnung AS A_Bezeichnung,
                        bg.BearbeiterID_Extern AS BearbeiterID,
                        'extern' AS BearbeiterTyp
                FROM    Auftrag a
                LEFT OUTER JOIN Bearbeitergruppe bg ON a.Gruppe_ID = bg.Gruppe_ID
                WHERE    bg.BearbeiterID_Extern IS NOT NULL
                UNION ALL
                SELECT    a.bezeichnung AS A_Bezeichnung,
                        bg.BearbeiterID_Intern AS BearbeiterID,
                        'intern' AS BearbeiterTyp
                FROM    Auftrag a
                LEFT OUTER JOIN Bearbeitergruppe bg ON a.Gruppe_ID = bg.Gruppe_ID
                WHERE    bg.BearbeiterID_Intern IS NOT NULL
                AND        bg.BearbeiterID_Intern IS NULL
                UNION ALL
                SELECT    a.bezeichnung AS A_Bezeichnung,
                        bg.BearbeiterID_Intern AS BearbeiterID,
                        'nicht vorhanden' AS BearbeiterTyp
                FROM    Auftrag a
                LEFT OUTER JOIN Bearbeitergruppe bg ON a.Gruppe_ID = bg.Gruppe_ID
                WHERE    bg.BearbeiterID_Intern IS NULL
                AND        bg.BearbeiterID_Intern IS NULL ) tbl
    LEFT OUTER JOIN Bearbeiter ba ON tbl.BearbeiterID = ba.ID
    Nein, das soll keine moderne Kunst sein.
     
    PLSQL_SQL gefällt das.
  7. flosharok

    flosharok Neuer Benutzer

    hi ukulele,

    hat nicht ganz funktioniert aber das ist schon nah dran an dem was ich brauch.
    Dank dir habe ich eine Idee / Ansatz wie ich da zu meiner Lösung kommen könnte.

    Vielen Dank für deine Hilfe!
     
  8. ukulele

    ukulele Datenbank-Guru

    Gut, ist tatsächlich nicht so ganz einfach aber auf jedenfall machbar.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden