Sql join

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Sql join

    Also ich verzweifle brauche einen Outer join

    Datenbank ORACLE:-(

    Tabelle 1 Mitarbeiter mit MA_NR VON_DTM und BIS_DTM

    Tabelle 2 LAGER mit MA_NR,LAGER_NR, VON_DTM und BIS_DTM

    Daten
    Es sind ca 60 vorhande Mitarbeiter da aber nur 30 haben ein Lager!

    Ich will nur gültige Mitarbeiter sehen und falls ein Lager vorhanden ist die Lager_NR dazu.

    Mein Select
    Code:
    select Mitarbeiter.*, LAGER.LAGER_NR  from LAGER, Mitarbeiter
    where LAGER.LAGER_NR = Mitarbeiter.LAGER_NR(+)
    and sysdate between Mitarbeiter.VON_DTM AND Mitarbeiter.BIS_DTM
    and sysdate between LAGER.VON_DTM AND LAGER.BIS_DTM
    Bekomme aber nur die 30 Mitarbeiter raus die auch ein Lager haben:-(



    Wie mache ich das richtig mit einem outerjoin?

    DANKE!
    Zuletzt geändert von glob; 15.03.2010, 21:12.

  • #2
    Hallo,

    du liest bitte die Forenregeln, passt deinen Beitrag entsprechend an und dann liest du dir einfach durch, wie es geht und wendest das dort gelernte auf deine Abfrage an, statt mit Komma und Where (Theta-Style-Join) zu arbeiten.

    Bei weiteren und konkreteren Fragen helfen wir gerne weiter.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Code:
      [FONT=Courier New][SIZE=2] [COLOR=blue]SELECT[/COLOR] [COLOR=maroon]mitarbeiter[/COLOR][COLOR=silver].[/COLOR][COLOR=silver]*[/COLOR][COLOR=silver],[/COLOR] 
             [COLOR=maroon]lager[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]lager_nr[/COLOR] 
      [COLOR=blue]FROM[/COLOR]   [COLOR=maroon]mitarbeiter[/COLOR] 
             [COLOR=blue]RIGHT[/COLOR] [COLOR=blue]JOIN[/COLOR] [COLOR=maroon]lager[/COLOR] 
               [COLOR=blue]ON[/COLOR] [COLOR=maroon]mitarbeiter[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]id[/COLOR] [COLOR=silver]=[/COLOR] [COLOR=maroon]lager[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]lager_nr[/COLOR] 
                  [COLOR=blue]AND[/COLOR] [COLOR=maroon]sysdate[/COLOR] [COLOR=blue]BETWEEN[/COLOR] [COLOR=maroon]mitarbeiter[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]von_dtm[/COLOR] [COLOR=blue]AND[/COLOR] [COLOR=maroon]mitarbeiter[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]bis_dtm[/COLOR] 
                  [COLOR=blue]AND[/COLOR] [COLOR=maroon]sysdate[/COLOR] [COLOR=blue]BETWEEN[/COLOR] [COLOR=maroon]lager[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]von_dtm[/COLOR] [COLOR=blue]AND[/COLOR] [COLOR=maroon]lager[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]bis_dtm[/COLOR] [/SIZE][/FONT]
      Kann den leider im Moment nicht überprüfen aber für mich ist es immer noch der gleiche sql Befehl?

      Kommentar


      • #4
        ich glaube, dass du LEFT JOIN brauchst.
        Slava
        bituniverse.com

        Kommentar


        • #5
          Zitat von glob Beitrag anzeigen
          Code:
          ON mitarbeiter.id = lager.lager_nr
          Ich hoffe, hier hast du dich vertan und sprichst deine Mitarbeiter nicht mit der Nummer des Lagerplatzes an, auf dem du sie einsperrst. Das ist nämlich verboten und erwiesenermaßen motivationssenkend

          Als ich sagte "ohne Komma und Where", meinte ich damit nicht, dass du die Where-Klausel ganz ersetzen sollst. Sie ist natürlich immer noch dazu da, die Datensätze im Ergebnis rauszufiltern, die man wirklich haben will. Die on-Klausel dagegen legt die Bedingungen fest, unter denen zwei zu joinende Datensätze kombiniert werden dürfen.

          Deine sysdate-Vergleiche haben den Anschein, als gehörten sie in die Where-Klausel.

          Gruß,

          Amica
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            War schon zu spät gestern.^^

            Code:
            [FONT=Courier New][SIZE=2] [COLOR=blue]SELECT[/COLOR] [COLOR=maroon]mitarbeiter[/COLOR][COLOR=silver].[/COLOR][COLOR=silver]*[/COLOR][COLOR=silver],[/COLOR] 
                   [COLOR=maroon]lager[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]lager_nr[/COLOR] 
            [COLOR=blue]FROM[/COLOR]   [COLOR=maroon]mitarbeiter[/COLOR] 
                   [COLOR=blue]LEFT JOIN[/COLOR] [COLOR=maroon]lager[/COLOR] 
                     [COLOR=blue]ON[/COLOR] [COLOR=maroon]mitarbeiter[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]id[/COLOR] [COLOR=silver]=[/COLOR] [COLOR=maroon]lager[/COLOR][COLOR=silver].[COLOR=maroon]Mitarbeiter[/COLOR][/COLOR][COLOR=maroon]_nr[/COLOR] 
                        [COLOR=blue]WHERE[/COLOR] [COLOR=maroon]sysdate[/COLOR] [COLOR=blue]BETWEEN[/COLOR] [COLOR=maroon]mitarbeiter[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]von_dtm[/COLOR] [COLOR=blue]AND[/COLOR] [COLOR=maroon]mitarbeiter[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]bis_dtm[/COLOR] 
                        [COLOR=blue]AND[/COLOR] [COLOR=maroon]sysdate[/COLOR] [COLOR=blue]BETWEEN[/COLOR] [COLOR=maroon]lager[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]von_dtm[/COLOR] [COLOR=blue]AND[/COLOR] [COLOR=maroon]lager[/COLOR][COLOR=silver].[/COLOR][COLOR=maroon]bis_dtm[/COLOR] [/SIZE][/FONT]
            Bei dem Select zeigt er leider immer noch alle Mitarbeiter an auch die ungültigen Sätze:-(

            Und ka das Ergebnis ist anders aber für mich ich da kein unterschied zu meinem ersten select.
            Zuletzt geändert von glob; 16.03.2010, 20:23.

            Kommentar


            • #7
              zu welcher tabelle gehört sysdate?
              Zuletzt geändert von Slava; 16.03.2010, 23:13.
              Slava
              bituniverse.com

              Kommentar


              • #8
                Zitat von Slava Beitrag anzeigen
                zu welcher tabelle gehört sysdate?
                SYSDATE ist einfach nur das Datum von heute.

                Kommentar


                • #9
                  ups, ich habe vergessen dass du mit ORACLE arbeitest.
                  Ich kann es leider nicht testen, probiere es so
                  Code:
                  select m.*, l.lager_nr
                   from (select * from mitarbeiter where sysdate BETWEEN mitarbeiter.von_dtm AND mitarbeiter.bis_dtm) as m 
                  left join (select lager_nr,Mitarbeiter_nr from lager  where sysdate BETWEEN lager.von_dtm AND lager.bis_dtm) as l on m.id=l.Mitarbeiter_nr
                  Zuletzt geändert von Slava; 17.03.2010, 10:54.
                  Slava
                  bituniverse.com

                  Kommentar


                  • #10
                    Der geht Danke!!!

                    Kommentar

                    Lädt...
                    X