Announcement

Collapse
No announcement yet.

Filter im JOIN oder mit WHERE - Unterschied?

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

  • Filter im JOIN oder mit WHERE - Unterschied?

    Hallo!

    Ich hätte mal eine Frage, was ist der Unterschied ob ich im JOIN filtere, oder aber erst im WHERE, ist das egal also nur Kosmetik oder macht das irgendow einen richtigen Unterschied?

    Filter im JOIN:
    Code:
    SELECT t.SpielIDRef, t.Nickname, t.TippTor1, t.TippTor2
    FROM tabtipps t
    INNER JOIN tabspiele s
      ON (t.SpielIDRef = s.SpielID AND t.SpielIDRef=4067)
    ORDER BY t.Nickname ASC
    Filter im WHERE
    Code:
    SELECT t.SpielIDRef, t.Nickname, t.TippTor1, t.TippTor2
    FROM tabtipps t
    INNER JOIN tabspiele s
      ON (t.SpielIDRef = s.SpielID)
    WHERE t.SpielIDRef = 4067
    ORDER BY t.Nickname ASC
    //EDIT:
    Ziel soll es sein alle Tipps (der User) zu einem Spiel anzuzeigen (sofern getippt, daher INNER JOIN).


    Vielen Dank!
    Juergen
    Zuletzt editiert von hausl78; 31.08.2010, 14:57.

  • #2
    Hallo,

    bei einem INNER JOIN macht es rein technisch keinen Unterschied ob du die Bedingung an die Definition des Join schreibst oder in der Where-Klausel notierst. Entscheidend ist hier nur wo sie "rein logisch" hingehört. Dient die Bedingung dazu, die zu joinenden Datensätze einzuschräncken - dann gehöhrt sie zur Join-Bedingung - oder soll sie die gesamte Ergebnismenge beeinflussen, dann ist sie Teil der Where-Klausel.
    Wie gesagt für den INNER JOIN macht es keinen Unterschied. Interressant wird es aber beim OUTER JOIN. Hier ist es schon entscheidend, wo die Bedingung formuliert wird.
    Eine Bedingung die sich nicht auf die zu joinende Tabelle bezieht und den Join nicht beeinflusst, hat jedoch in keinem Fall etwas in der Join-Bedingung zu suchen. Für dein Bsp. gehört sie also definitiv in die Where-Klausel!
    Das ist korrekt:
    [highlight=sql]
    select a.id, b.name
    from tab_a a
    inner join tab_b b on b.id = a.id and b.name like 'A%'
    [/highlight]
    und liefert alle Einträge in a, die eine Entsprechung in der Untermenge name like 'A%' von b haben.
    Das ist identisch mit allen in a, die eine Entsprechung in b haben und die der Bedingung b.name like 'A%' genügen. Deshalb kann das auch so formuliert werden:
    [highlight=sql]
    select a.id, b.name
    from tab_a a
    inner join tab_b b on b.id = a.id
    where b.name like 'A%'
    [/highlight]

    Das ist ebenfalls korrekt:
    [highlight=sql]
    select a.id, b.name
    from tab_a a
    left join tab_b b on b.id = a.id and b.name like 'A%'
    [/highlight]
    Es liefert alle in a, die eine oder keine Entsprechung in der Untermenge name like 'A%' von b haben.
    Das ist jedoch NICHT identisch mit allen in a, die eine oder keine Entsprechung in b haben und die der Bedingung b.name like 'A%' genügen. Deshalb kann dies NICHT so formuliert werden:
    [highlight=sql]
    select a.id, b.name
    from tab_a a
    left join tab_b b on b.id = a.id
    where b.name like 'A%'
    [/highlight]
    Diese Formulierung macht aus dem LEFT JOIN wieder einen INNER JOIN!

    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


    • #3
      Alles klar, danke für die ausführliche Erklärung!

      juergen

      Comment

      Working...
      X