Announcement

Collapse
No announcement yet.

Frage zu einer Aufgabe

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage zu einer Aufgabe

    Hallo,

    es soll der Abteilungsleiter mit Namen von jedem Mitarbeiter angezeigt werden. Zusätzlich soll auch die Abteilungsbezeichnung neben dem Abteilungsleiter ausgegeben werden und falls kein Abteilungsleiter vorhanden ist, soll das Feld leer sein.
    Tabellen sind dem Anhang zu entnehmen.
    Meine bisherige Abfrage ist folgende:

    [highlight=sql]
    SELECT t_personaldaten.persnr, pname, abtname, pname AS Abteilungsleiter
    FROM ((t_personaldaten) LEFT JOIN t_abteilung ON (t_personaldaten.abtnr=t_abteilung.abtnr)) LEFT JOIN t_abteilungsleiter ON (t_personaldaten.abtnr=t_abteilungsleiter.abtnr)
    ORDER BY t_personaldaten.persnr
    [/highlight]

    Leider weiß ich nicht wie ich eine Abfrage gestalte, die anhand der t_personaldaten.abtnr zu t_abteilungsleiter.abtnr -> t_abteilungsleiter.persnr -> t_personaldaten.persnr -> t_personaldaten.pname gelangt und so den Abteilungsleiter mit Namen erhält.
    Attached Files

  • #2
    Hallo,
    Originally posted by knobe View Post
    ...Leider weiß ich nicht wie ich eine Abfrage gestalte, die anhand der t_personaldaten.abtnr zu t_abteilungsleiter.abtnr -> t_abteilungsleiter.persnr -> t_personaldaten.persnr -> t_personaldaten.pname gelangt und so den Abteilungsleiter mit Namen erhält.
    Einfach mit einem weiteren LEFT JOIN auf t_personaldaten mit t_abteilungsleiter.persnr = t_personaldaten.persnr. Allerdings musst du hier mit Tabellenaliasen arbeiten, um die Eindeutigkeit der Tabellen zu waren.

    Frage: Gibt es Mitarbeiter, die keiner Abteilung zugeordnet sind oder ist t_personaldaten.abtnr ein NOT NULL-Feld? Bei zweiterem ist der LEFT JOIN auf t_abteilung sinnlos und kann ein INNER JOIN sein.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Du musst die Personaltabelle ein 2. Mal in die Query aufnehmen, um von beiden Mengen "parallel" die Namen zu erhalten. Zur Unterscheidung verwendet man für die 2 identischen Tabellenaufrufe unterschiedliche Tabellen Alias. Das müsste Access glaub ich auch automatisch machen, wenn Du die Abfrage grafisch erstellst und die Tabelle ein 2. Mal hinzufügst.

      Edit: Hab Falks Beitrag zu spät gesehen.
      Gruß, defo

      Comment


      • #4
        Originally posted by Falk Prüfer View Post
        Einfach mit einem weiteren LEFT JOIN auf t_personaldaten mit t_abteilungsleiter.persnr = t_personaldaten.persnr. Allerdings musst du hier mit Tabellenaliasen arbeiten, um die Eindeutigkeit der Tabellen zu waren.

        Frage: Gibt es Mitarbeiter, die keiner Abteilung zugeordnet sind oder ist t_personaldaten.abtnr ein NOT NULL-Feld? Bei zweiterem ist der LEFT JOIN auf t_abteilung sinnlos und kann ein INNER JOIN sein.

        Gruß Falk
        Ich habe nun folgende Abfrage erstellt (leider funktioniert der INNER JOIN bei der 3. Tabelle (Zeile 4 unten) anstatt des LEFT JOIN nicht
        MS error: JOIN-Ausdruck nicht unterstützt.
        [highlight=sql]
        SELECT p.persnr, p.pname, abtname, p2.pname AS Abteilungsleiter
        FROM (((t_personaldaten AS p) LEFT JOIN t_abteilung AS a ON p.abtnr=a.abtnr)
        LEFT JOIN t_abteilungsleiter AS al ON p.abtnr=al.abtnr)
        LEFT JOIN t_personaldaten AS p2 ON al.abtnr=p2.abtnr
        ORDER BY p.persnr
        [/highlight]

        Jedoch bekomme ich bei der Spalte Abteilungsleiter nicht den eindeutigen Abteilungsleiter pro Abteilung heraus, sondern mehrere.

        EDIT: Ich hab es hinbekommen mit einem weiteren LEFT JOIN:
        [highlight=sql]
        SELECT p.persnr, p.pname, a.abtname, p3.pname AS Abteilungsleiter
        FROM ((((t_personaldaten AS p) LEFT JOIN t_abteilung AS a ON p.abtnr=a.abtnr)
        LEFT JOIN t_abteilungsleiter AS al ON p.abtnr=al.abtnr)
        LEFT JOIN t_personaldaten AS p2 ON al.abtnr=p2.abtnr)
        LEFT JOIN t_personaldaten AS p3 ON al.persnr=p3.persnr
        ORDER BY p.persnr
        [/highlight]

        Kann ich die Abfrage auch nur mit 3 JOINs anstat 4 formulieren?
        Zuletzt editiert von knobe; 13.03.2012, 16:42.

        Comment


        • #5
          Hallo,
          Originally posted by knobe View Post
          ...Jedoch bekomme ich bei der Spalte Abteilungsleiter nicht den eindeutigen Abteilungsleiter pro Abteilung heraus, sondern mehrere.
          Du verwendest ja auch eine falsche Bedingung für den Join. Warum joinst du die zusätzlichen Personaldaten über die Abtnr statt die Persnr? Meiner Meinung nach müsste das eher so aussehen:
          [highlight=sql]
          SELECT ma.Persnr, ma.PName, ma.PVorname, abt.Abtname, ltr.PName as Abteilungsleiter
          from t_personaldaten as ma
          join t_abteilung as abt on abt.Abtnr = ma.Abtnr
          LEFT JOIN t_abteilungsleiter as abt_ltr on abt_ltr.Abtnr = ma.Abtnr
          LEFT JOIN t_personaldaten as ltr on ltr.Persnr = abt_ltr.Persnr
          [/highlight]

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment

          Working...
          X