Announcement

Collapse
No announcement yet.

View aus 2(3) Tabellen (+"Beziehungstabelle")

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

  • View aus 2(3) Tabellen (+"Beziehungstabelle")

    Hallo zusammen,

    ich habe ein Problem, welches wahrscheinlich für die meisten hier total lächerlich ist, aber ich hab wohl irgendwie ein Brett vor dem Kopf oder mir fehlt noch das letzte Fünkchen Verständnis....

    Ich habe mehrere Tabellen, die in unterschiedlichen Parent-Child Beziehungen zueinander stehen. Z.B. Tbl_Aufträge, Tbl_Werksaufträge, Tbl_Druckaufträge, Tbl_Weiterverarbeitungsaufträge, etc.

    Zudem gibt es eine Tabelle, die die ganzen Beziehungen definiert, heisst Tbl_ObjectDirectory, warum auch immer.
    In dieser wird definiert wie die Beziehungen sind.
    1. Spalte ID, 2. Spalte ParentID, 3. Spalte (Metadaten), ....
    In dieser Tabelle sind ALLE Beziehungen ALLER Tabellen definiert.
    Werkauftrag_ID_1 (ChildID) hat Auftrag_ID_1 als ParentID
    Werkauftrag_ID_2 (ChildID) hat Auftrag_ID_2 als ParentID...
    Druckauftrag_ID_1 (ChildID) hat Auftrag_ID_3 als ParentID
    Druckauftrag_ID_2 (ChildID) hat Auftrag_ID_4 als ParentID
    Weiterverarbeitungsauftrag_ID_1 (ChildID) hat Druckauftrag_ID_1 als ParentID...

    So, nun muss aber nicht jeder Druckauftrag einen Weiterverarbeitungsauftrag als "Child" haben. Z.B Druckauftrag_ID_2 hat kein "Child", also keinen Weiterverarbeitungsauftrag.

    Nun möchte ich Tbl_Druckaufträge und Tbl_Weiterverabeitungsaufträge in EINER View (mitsamt aller Spalten beider Tabellen) abbliden.
    Wie kriege ich es hin, dass das dann später so aussieht:
    Spalte 1 -- Spalte 2
    Druckauftrag_ID_1 -- Weiterverabeitungs_ID_1 ...
    Druckauftrag_ID_2 -- null ...
    ...

    Ich bekomme entweder nur die Zeilen wo eben Parent und Child definiert sind, aber eben nicht die Zeilen wo nur der Parent ohne Child auftaucht, oder über "Union" zweier gertrennter Statements (Statement 1:
    Tbl_Weiterverarbeitung_ID = Tbl_ObjectDirectory_ChildID AND
    Tbl_Druckauftrag_ID = Tbl_ObjectDirectory_ParentID
    Statement 2:
    Tbl_Druckauftrag_ID = Tbl_Objectdirectory_ChildID)
    dieses hier:

    Spalte 1 -- Spalte 2
    Druckauftrag_ID_1 -- Weiterverabeitungs_ID_1 ...
    Druckauftrag_ID_1 -- null ...
    Druckauftrag_ID_2 -- null ...
    Druckauftrag_ID_2 -- null ...

    Ich hoffe, dass man meine Schilderung einigermassen verstehen kann

    Leider hab ich das gesamte Statement gerade nicht zu Hand (anderer Rechner), werde ich morgen nachreichen.
    Aber vielleicht kann mir ja auch so schon jemand einen Tipp geben, wie das zu lösen wäre?!
    Ansonsten morgen nachdem ich das Statement (bzw. meine unzähligen Versuche) nachliefere.

    Danke auf jeden Fall schon mal, wenn sich das jemand durchliest und versteht

    Gruss
    Steph

  • #2
    sevus

    schau Dir mal joins an insbesondere left join

    bzw. die Schreibweise bei where a = b(+)

    Comment


    • #3
      Hallo,
      danke für die Rückmeldung. Das hatte ich versucht, allerdings ist mir nicht klar, wie ich das mit 3 Tabellen hinbekomme.

      Hier ein Beispiel wie ich es versucht habe (eben mit "Union")
      (WorkPressJob (WPJ) = Druckauftrag, WorkPressJobRun(WPJR) = Weiterverabreitungsauftrag)

      Code:
      create or replace view VIEW_WRK_WORKPRINTJOB as
      (select WPJ.ID as WORKPRESSJOBID, to_char(null) as WORKPRINTJOBID, OD.PARENTID as PARENTID, 
      WPJ.EARLIESTPOSSIBLEBEGINOFFSET, WPJ.LATESTPOSSIBLEEND, WPJ.CIRCULATION AS 
      CIRCULATION_WPJ, WPJ.PRESSSPEED, WPJ.STANDARDPAPERID AS STANDARDPAPERID_WPJ, 
      to_date(null) as PRESETTIME, to_number(null) as SETUPDURATION, to_number(null) as 
      PROCESSINGDURATION, to_number(null) as CLEANUPDURATION, 
      to_number(null) as CIRCULATION_WORKPRINTJOB, to_number(null) as STATE, to_char(null) as PSLPRESSID, to_char(null) as PSLPRODUCTID, to_char(null) as PSLPRODUCTIONID, 
      to_char(null) as STANDARDPAPERID_WORKPRINTJOB, to_char(null) as COMMENTARY, to_number(null) as
       BALANCINGMODE, to_number(null) as PLANNEDSPEED, to_number(null) as ALLOWANCE, 
      to_number(null) as REFERENCECOPIES 
      
      from WRK_WORKPRESSJOB WPJ join ABB_OBJECTDIRECTORY OD
      on WPJ.ID = OD.ID
      
      Union
      
      select WPJ.ID as WORKPRESSJOBID, WPJR.ID as WORKPRINTJOBID, OD.PARENTID as PARENTID, 
      WPJ.EARLIESTPOSSIBLEBEGINOFFSET, WPJ.LATESTPOSSIBLEEND, WPJ.CIRCULATION AS 
      CIRCULATION_WPJ, WPJ.PRESSSPEED, WPJ.STANDARDPAPERID AS STANDARDPAPERID_WPJ, 
      WPJR.PRESETTIME, WPJR.SETUPDURATION, WPJR.PROCESSINGDURATION, WPJR.CLEANUPDURATION, 
      WPJR.CIRCULATION AS CIRCULATION_WORKPRINTJOB,WPJR.STATE, 
      WPJR.PSLPRESSID, WPJR.PSLPRODUCTID, WPJR.PSLPRODUCTIONID, WPJR.STANDARDPAPERID AS 
      STANDARDPAPERID_WORKPRINTJOB, WPJR.COMMENTARY, WPJR.BALANCINGMODE, 
      WPJR.PLANNEDSPEED, WPJR.ALLOWANCE, WPJR.REFERENCECOPIES
      
      from WRK_WORKPRESSJOB WPJ, WRK_WORKPRESSJOBRUN WPJR, ABB_OBJECTDIRECTORY OD
      where WPJR.ID = OD.ID and WPJ.ID = OD.PARENTID)
      Das Ergebnis davon ist dann folgendes:

      WorkPressJobID | WorkPressjobRunID (WorkPrintJobID) | ParentID
      -----------------------------------------------------------------------------------------
      1. 004ee6c5-72c9-4069-adc1-04a90f4a2e8f | 7aa7f0e9-3c87-4163-8bcf-ba42aeb48535 | 004ee6c5-72c9-4069-adc1-04a90f4a2e8f
      2. 004ee6c5-72c9-4069-adc1-04a90f4a2e8f | null | 26bfb0c0-1347-4c70-a3c3-bb2af09697f5
      3. 017edd07-3ca6-42bf-aaf7-e32091fe38db | 6c85cf1c-06f3-4472-aa06-1ac55429d626 | 017edd07-3ca6-42bf-aaf7-e32091fe38db
      4. 017edd07-3ca6-42bf-aaf7-e32091fe38db | null | 24b02e1d-d15d-43ad-9f7f-f07ab23c7a03
      5. 01d73050-37da-4466-90bc-6399336b472e | null | 170d9459-46ad-4589-ab47-acaa44127404

      Zeile 5 ist korrekt.

      Zeile 1 und 2 (bzw. 3 und 4) müsste kombiniert werden, und zwar mit
      Zeile 2 1. Spalte, Zeile 1 2. Spalte und Zeile 2 3. Spalte.
      Dann wäre es korrekt.

      Gruss und Danke
      Zuletzt editiert von armerTropf; 28.10.2010, 09:18. Reason: neue Abffrage + Ergebnis hinzugefügt

      Comment


      • #4
        wie sieht es denn hiermit aus?

        select WPJ.ID as WORKPRESSJOBID, WPJR.ID as WORKPRINTJOBID, OD.PARENTID as PARENTID,
        WPJ.EARLIESTPOSSIBLEBEGINOFFSET, WPJ.LATESTPOSSIBLEEND, WPJ.CIRCULATION AS
        CIRCULATION_WPJ, WPJ.PRESSSPEED, WPJ.STANDARDPAPERID AS STANDARDPAPERID_WPJ,
        WPJR.PRESETTIME, WPJR.SETUPDURATION, WPJR.PROCESSINGDURATION, WPJR.CLEANUPDURATION,
        WPJR.CIRCULATION AS CIRCULATION_WORKPRINTJOB,WPJR.STATE,
        WPJR.PSLPRESSID, WPJR.PSLPRODUCTID, WPJR.PSLPRODUCTIONID, WPJR.STANDARDPAPERID AS
        STANDARDPAPERID_WORKPRINTJOB, WPJR.COMMENTARY, WPJR.BALANCINGMODE,
        WPJR.PLANNEDSPEED, WPJR.ALLOWANCE, WPJR.REFERENCECOPIES
        from WPJABB_OBJECTDIRECTORY OD join WRK_WORKPRESSJOB WPJ on WPJ.ID = OD.ID
        join WRK_WORKPRESSJOBRUN WPJR on WPJR.ID = OD.ID


        P.S.: Ich habe Deine Schreibweise verwendet, aber Du solltest das ganze etwas leserlicher gestallten

        Comment


        • #5
          Hi,

          da kommen keine Daten zurück, denn wenn ich den Join richtig verstehe, bekomme ich ja beim ersten Join alle Einträge, wo WorkPressJob ID der "Child ID" in der ObjectDirectory Tabelle entspricht.
          So weit so gut, allerdings wird dann beim zweiten Join dann zusätzlich auf die WorkPressJobRunID (WorkPrintJob) abgefragt, die wiederum der "ChildID" in der ObejctDirectory Tabelle entsprechen sollen.
          Aber diese Einträge habe ich beim ersten Join ja gar nicht erhalten.
          Beim ersten Join habe ich ja nur die ID's abgefragt die selber keine Kinder haben. Im zweiten Schritt will ich dann die ID's haben die Kinder haben...

          Ich weiss ist total wirr zu beschreiben, aber vielleicht verstehst du es ja doch.

          P.s. Versuche beim nächsten Mal die Schreibweise anzupassen. Sorry

          Comment


          • #6
            jepp stimmt, ich habe das left vergessen

            du solltest das ganze mit left join versuchen und zwar beide male

            Comment


            • #7
              ...now it works :-)

              Code:
              ...from WRK_WorkPressJob WPJ left outer join ABB_Objectdirectory PJROD 
              on WPJ.ID= PJROD.ParentID left outer join WRK_WorkPressJobRun WPJR 
              on PJROD.ID = WPJR.ID
              Danke für die Unterstützung.

              Comment

              Working...
              X