Announcement

Collapse
No announcement yet.

Where-Bedingung, Joins zeigt nicht alle Datensätze

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

  • Where-Bedingung, Joins zeigt nicht alle Datensätze

    Hallo Leute,

    ich hab da ein Problem mit einer Abfrage. Um genauer zu werden, geht es um folgende Abfrage:

    VORGANG.VORGANGID AS VORGANGID,
    PROJEKTE.PROJEKTID AS PROJEKTID,
    FIRMA.NAME AS KUNDE,
    VORGANG.NAME AS VORGANGNAME

    FROM
    PROJEKTE,
    VORGANG,
    ARBEITSZEITEN,
    FIRMA

    WHERE
    ( PROJEKTE.FIRMAID=FIRMA.FIRMAID )
    AND ( VORGANG.PROJEKTID(+)=PROJEKTE.PROJEKTID )
    AND ( VORGANG.VORGANGID = ARBEITSZEITEN.VORGANGID(+))

    GROUP BY
    VORGANG.VORGANGID,
    PROJEKTE.PROJEKTID,
    FIRMA.NAME,
    VORGANG.NAME


    Als Ergebnis liefert mir die oben stehende Abfrage alle Vorgänge pro Projekt. So weit so gut, dachte ich...!
    Bei einer Datenbankstichprobe und einer nach genauerer Analyse der betroffenen Tabellen in der Datenbank ist mir aufgefallen,
    dass vereinzelt nicht alle Vorgänge zu jedem Projekt angezeigt wurden.
    Nach längerem Überlegen fand ich auch den Grund dafür heraus.
    Die Where-Bedingung: ( VORGANG.PROJEKTID(+)=PROJEKTE.PROJEKTID ) zeigt alle Datensätze der Tabelle "VORGANG" an, die mit der PROJEKTID übereinstimmen
    Die Where-Bedingung: ( VORGANG.VORGANGID = ARBEITSZEITEN.VORGANGID(+)) zeigt alle Datensätze der Tabelle "Arbeitszeiten" an, die mit der VORGANGID übereinstimmen

    In der genannten Datenbankstichprobe fand ich heraus, dass das Projekt mit der PROJEKTID "300" zwei Vorgänge hat. Allerdings zeigte meine Abgfrage nur eine an.
    Also filtere ich die Abfrage auf dieses Projekt. Ich begann mit den Where-Bedingungen zu experementieren.
    Ich kommentierte die Where-Bedingung: ( VORGANG.VORGANGID = ARBEITSZEITEN.VORGANGID(+)) aus und nun zeigte mir die Abfrage die zwei dazugehörigen Vorgänge.
    Ich meinte die Lösung gefunden zu haben, also löste ich die Filterung auf das Projekt mit der ProjektID "300", um mir alle Projekte anzeigen zu lassen!
    Aber dann kann kam die Fehlermeldung: ORA-01652: Temp-Segment kann nicht um 128 in Tablespace erweitert werden

    Das Problem ist, dass in der Tabelle "Arbeitszeiten" noch keine Datensätze für den fehlenden Vorgang angelegt wurden und mir
    die Where-Bedingungen deshalb nur die Vorgänge zeigen, für die in der Tabelle "Arbeitszeiten" auch Datensätz angelegt wurden.
    Erst duch das auskommentieren der Where-Bedingung: ( VORGANG.VORGANGID = ARBEITSZEITEN.VORGANGID(+)) konnte ich dies umgehen,
    aber nur so lange die Filterung auf ein Projekt aktiv war!
    Ich weiss nicht weiter! Für jede Hilfe bin ich sehr dankbar! Ich hoffe ich konnte das Problem, verständlich erklären!

    Bedanke mich schon mal im Voraus!!!

    Viele Grüße
    David

  • #2
    In der genannten Datenbankstichprobe fand ich heraus, dass das Projekt mit der PROJEKTID "300" zwei Vorgänge hat. Allerdings zeigte meine Abgfrage nur eine an.
    Doppelte Datensätze filterst Du ja mit deinem GROUP BY heraus (im übrigen vermutlich auch die Ursache für deinen vollgelaufenen TEMP-TS). Sollten also auch die anderen Felder für das Projekt mit der ID=300 identisch sein, wäre das die Erklärung.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Hallo David,

      ist evtl. der Right-Outer-Join
      ...AND ( VORGANG.VORGANGID = ARBEITSZEITEN.VORGANGID(+))... falsch definiert und sollte besser ein Left-Outer-Join sein?
      ...AND ( VORGANG.VORGANGID(+) = ARBEITSZEITEN.VORGANGID)

      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


      • #4
        @ dimitri:
        Die Datensätze sind nicht identisch. D.h. dass beide Vorgänge des Projektes mit der ProjektID "300" angezeit werden müssten, trotz Group By Anweisung!

        @ Falk Prüfer
        Ich habe mal deine Anweisung befolgt. Leider kommt da jetzt folgende Fehlermeldung:
        "ORA-01417: Tabelle darf mit max. einer anderen Tabelle durch Outer-Join verbunden werden"
        Also habe ich zusätzlich die Where-Bedingungen:
        ( BDH.VORGANG.PROJEKTID(+)=BDH.PROJEKTE.PROJEKTID )
        ( BDH.PROJEKTE.AUFTRAGID(+)=BDH.AUFTRAG.AUFTRAGID )

        Folgendermaßen geändert:
        ( BDH.VORGANG.PROJEKTID=BDH.PROJEKTE.PROJEKTID(+) )
        ( BDH.PROJEKTE.AUFTRAGID=BDH.AUFTRAG.AUFTRAGID(+) )


        Erst dann hat mir die Abfrage wieder ein Ergebnis geliefert. Allerdings dasselbe.
        Sprich: Nicht alle Vorgänge wurden angezeigt!!!


        Vielen Dank für Eure Hilfe! Habt ihr noch weitere Vorschläge?!

        Viele Grüße
        DFCE

        Comment


        • #5
          Hallo,

          dumme Frage:

          Wozu ist der Outer JOIN von Vorgang auf Projekte gut?
          Gibt es auch Vorgänge ohne Projekte?

          Gruß
          docendo discimus

          Comment


          • #6
            Alle Vorgänge gehören zu einem entsprechendem Projekt! Der Join soll dafür sorgen, alle Vorgänge eines Projektes anzuzeigen!!!

            Comment


            • #7
              Hallo,

              Outer Joins sind dazu da, ein Ergebnis anzuzeigen, wenn es einen verbundenen Satz nicht gibt. Wenn es zu allen Vorgängen ein Projekt gibt, genügt ein normaler JOIN.
              docendo discimus

              Comment


              • #8
                Where
                ( Projekte.firmaid=firma.firmaid )
                And ( Vorgang.projektid=projekte.projektid )
                And ( Vorgang.vorgangid(+) = Arbeitszeiten.vorgangid)
                docendo discimus

                Comment


                • #9
                  Originally posted by DFCE View Post
                  Alle Vorgänge gehören zu einem entsprechendem Projekt! Der Join soll dafür sorgen, alle Vorgänge eines Projektes anzuzeigen!!!
                  Hallo DFCE,

                  kann es sein daß du dir über die Bedeutung und Verwendung von OUTER und INNER JOINS nich ganz im klaren bist und damit deine Abfrage nicht sauber formulieren kannst?

                  Aus deinen Aussagen vermute ich mal folgende Abhängigkeiten:
                  Es gibt Projekte, zu jedem Projekt Vorgänge und zu jedem Vorgang Arbeitszeiten.
                  Wenn zu jedem Projekt immer mindestens ein Vorgang gehört, bzw. Projekte ohne Vorgänge für das Ergebnis irrelevant sind, benötigst du für diese Relation nur einen einfachen und keinen OUTER Join. Wird der OUTER Join benötigt, muß er natürlich in die richtige Richtung, also zu den Projekten hin definiert werden und nicht zu Vorgängen. Das Gleiche gilt analog für Vorgänge und Arbeitszeiten.

                  Nach meinem Verständnis müßten deine Joins also so aussehen:
                  [highlight=sql]
                  ...
                  WHERE
                  PROJEKTE.FIRMAID=FIRMA.FIRMAID
                  AND PROJEKTE.PROJEKTID(+) = VORGANG.PROJEKTID
                  AND VORGANG.VORGANGID(+) = ARBEITSZEITEN.VORGANGID
                  [/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


                  • #10
                    Hallo Leute,

                    nach langem hin und her sind wir nun zu dem Entschluss gekommen, dass nur die Datensätze in Vorgänge gezeigt werden können, für die auch in der Tabelle Arbeitszeiten Datensätze enthalten sind.
                    Eine anderen Lösung gibt es da leider nicht. Das hat alles mit den Joins zu tun. Änderungen der Joins nach euren Vorschlägen, hat leider auch nicht zum Ziel geführt!
                    Das ist jetzt aber nicht so dramatisch!

                    Vielen Dank an alle

                    Viele Grüße
                    DFCE

                    Comment

                    Working...
                    X