Announcement

Collapse
No announcement yet.

Verständnisfrage (join vs. where)

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

  • Verständnisfrage (join vs. where)

    Kann mir jemand den Unterschied erklären zwischen

    [highlight=sql]
    FROM dbo.TM_Warenpos INNER JOIN
    dbo.TS_Warenpos ON dbo.TM_Warenpos.MaterialID = dbo.TS_Warenpos.MaterialID LEFT OUTER JOIN
    dbo.TM_Benennungen ON dbo.TM_Warenpos.MaterialID = dbo.TM_Benennungen.ObjektID
    WHERE (dbo.TM_Benennungen.ObjektArt = 'M') AND (dbo.TM_Benennungen.Sprache = 'DE')
    [/highlight]

    und

    [highlight=sql]
    FROM dbo.TM_Warenpos INNER JOIN
    dbo.TS_Warenpos ON dbo.TM_Warenpos.MaterialID = dbo.TS_Warenpos.MaterialID LEFT OUTER JOIN
    dbo.TM_Benennungen ON dbo.TM_Warenpos.MaterialID = dbo.TM_Benennungen.ObjektID
    AND (dbo.TM_Benennungen.ObjektArt = 'M') AND (dbo.TM_Benennungen.Sprache = 'DE')
    [/highlight]

    Beim letzteren bekomme ich mehr Datensätze zurück als beim ersten.

  • #2
    Hallo Andreas,

    ist recht einfach: Die untere Abfrage ist ein echter OUTER JOIN und liefert Dir alle T_Warenpos Datensätze, zu denen es keinen korrespondierenden Eintrag in TM_Benennungen gibt.

    In der oberen Abfrage filterst Du noch Daten aus TM_Benennungen, damit fallen auch alle NULL Werte aus dem JOIN raus; Du hättest ebenso gut auch INNER statt LEFT JOIN schreiben können.

    Die obere bekommst Du zu unteren gleichwertig über:
    [highlight=SQL]FROM dbo.TM_Warenpos
    INNER JOIN dbo.TS_Warenpos
    ON dbo.TM_Warenpos.MaterialID = dbo.TS_Warenpos.MaterialID
    LEFT OUTER JOIN dbo.TM_Benennungen
    ON dbo.TM_Warenpos.MaterialID = dbo.TM_Benennungen.ObjektID
    WHERE (dbo.TM_Benennungen.ObjektArt = 'M' OR dbo.TM_Benennungen.ObjektArt IS NULL)
    AND (dbo.TM_Benennungen.Sprache = 'DE' OR dbo.TM_Benennungen.Sprache IS NULL)[/highlight]
    also indem Du bei TM_Benennungen auch NULL Werte zulässt.
    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
      ah, ok, jetzt hab ich es verstanden.
      Danke Olaf

      Comment


      • #4
        Wobei es vom fachlichem her es besser ist, ein PK/FK Feld auf NULL zu prüfen, den es könnte ja doch vorkommen, das es z.B. einen Datensatz der Sprache mit NULL gibt.
        [highlight=SQL]WHERE (dbo.TM_Benennungen.ObjektArt = 'M'
        AND dbo.TM_Benennungen.Sprache = 'DE')
        OR dbo.TM_Benennungen.ObjektID IS NULL[/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

        Working...
        X