Announcement

Collapse
No announcement yet.

Left outer join

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

  • Left outer join

    Hallo Leute,

    ich habe irgendwie ein Problem, was ich nicht verstehe.

    Soviel ich weiß macht man doch ein Left Join, wenn man von einer Tabelle alles ausgegeben haben möchte, obwohl es mit der 2ten tabelle keine Übereinstimmungen gibt.

    Also ich habe folgenden Code:

    DECLARE @RC int
    DECLARE @thisDate datetime
    SET @thisDate = '02.12.2010'

    SELECT i.artnr, i.[name], i.preis , u.anzahl, u.datum
    FROM Item i
    LEFT OUTER JOIN umsatz u ON i.id = u.item and u.datum = @thisdate
    WHERE i.artnr > 0
    ORDER BY artnr asc

    mit dem @thisdate bekomme ich 38348 Zeilen als Ergebnis zurück.

    Wenn ich @thisDate auf '01.12.2010' setze bekomme ich 38432 Zeilen raus.

    Wenn ich select * from item mache, dann bekomme ich 38275 Zeilen raus.

    Sehe ich den Fehler vielleicht nicht? Oder benutze ich den LEFT JOIN falsch?

    Bitte um Feedback.

    Grüße

  • #2
    Oder benutze ich den LEFT JOIN falsch?
    Genau das, den mit
    WHERE i.artnr > 0
    machst Du aus dem OUTER wieder ein INNER join

    Erweiteres um "OR i.artnr IS NULL" um auch NULL zuzulassen, wenn durch OUTER es keine Datensatz gibt.
    [highlight=SQL]
    SELECT i.artnr, i.[name], i.preis , u.anzahl, u.datum
    FROM Item i
    LEFT OUTER JOIN umsatz u ON i.id = u.item and u.datum = @thisdate
    WHERE i.artnr > 0 OR i.artnr IS NULL
    ORDER BY artnr asc
    [/highlight]
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hi Olaf,

      ich habe es versucht, so zu machen, wie du es gelöst hast. Jedoch besteht immer noch das gleich Problem.

      Die Zeilen-Ergebnisse sind genau gleich geblieben. Leider

      Evtl noch n Vorschlag?

      Gruß

      Comment


      • #4
        Ich habe rausgefunden wie es richtig funktioniert. Und zwar so:

        DECLARE @RC int
        DECLARE @thisDate datetime
        SET @thisDate = '02.12.2010'

        SELECT i.artnr, i.[name], i.preis , u.anzahl, u.datum
        FROM Item i
        LEFT OUTER JOIN umsatz u ON i.id = u.item
        ORDER BY artnr asc

        Einfach die WHERE Clausel und u.datum weglassen. --> dann funktionierts

        Ich glaub, solche Selects lassen sich nicht ohne eine temporäre Tabelle zu erstellen nicht realisieren. Oder gibt es evtl eine richtige Lösung?

        Grüße
        Zuletzt editiert von Daman; 03.12.2010, 12:59.

        Comment


        • #5
          a pros pros: ich benutz sql server 2005. ist für dieses system der left oder right join evtl noch nicht ausgereift?

          Comment


          • #6
            Ist ausgereift. Auch schon in n Versionen davor.

            Wenn ich @thisDate auf '01.12.2010' setze bekomme ich 38432 Zeilen raus.

            Wenn ich select * from item mache, dann bekomme ich 38275 Zeilen raus.
            Du hast einmal auf artnr geprüft und einmal nicht. Vermutlich hast du also 157 Datensätze in item mit einer artnr die kleiner oder gleich 0 ist.

            Comment


            • #7
              Originally posted by Ralf Jansen View Post
              Du hast einmal auf artnr geprüft und einmal nicht. Vermutlich hast du also 157 Datensätze in item mit einer artnr die kleiner oder gleich 0 ist.
              natürlich hab ich diese clausel berücksichtigt

              Comment


              • #8
                gibt es evtl anomalien, wenn man auf eine tabelle joined, die kein pk hat? trifft nämlich hier zu.

                Comment


                • #9
                  Hi Daman

                  Der left outer join funktioniert in SQL-Server absolut richtig. Der Knackpunkt ist wohl, dass es zu den Itemsätzen mehrere Umsatzsätze mit gleicher ID geben kann. Dann kannst Du natürlich zu einem Itemsatz mehrere Ergebnisse erhalten. Mach doch mal select * from umsatz.

                  Hi Olaf,

                  man kann aus dem Left Outer Join nur einen Inner Join machen, wenn sich die Where Bedingung
                  auf die rechte Tabelle bezieht. Mit
                  WHERE i.artnr > 0
                  kann das in diesem Fall also nicht passieren.

                  Gruß
                  Zuletzt editiert von frauwue; 05.12.2010, 14:18.
                  docendo discimus

                  Comment


                  • #10
                    Originally posted by frauwue View Post
                    Hi Daman

                    Der left outer join funktioniert in SQL-Server absolut richtig. Der Knackpunkt ist wohl, dass es zu den Itemsätzen mehrere Umsatzsätze mit gleicher ID geben kann. Dann kannst Du natürlich zu einem Itemsatz mehrere Ergebnisse erhalten. Mach doch mal select * from umsatz.

                    Gruß
                    Da hast du recht. Leider ist es in der Umsatztabelle so aufgebaut, dass lediglich die Artikel ID drin steht, ohne zu wissen, welcher Artikel gerade aktiv ist. Werde jetzt nur noch für aktive Artikel selektieren.

                    Danke für Eure Hilfe

                    Comment

                    Working...
                    X