Sven Rautenberg: welche funktion für primärschlüssel

Beitrag lesen

Hallo Sven,

Ausgerechnet ein ganz blödes Beispiel nimmst du da. Deine Abfrage macht sich besser so:

Ich habe mir schon überlegt, ob ich es mit JOIN oder nicht formulieren sollte. Dann habe ich mir gedacht, JOINs findet man sowieso alle Nase lang irgendwo, also mache ich es einmal so, daß es auch mit Datenabnken funktioniert, in welchen JOIN nicht implementiert ist (AFAIK ist Oracle das prominenteste Beispiel).

Das (SELECT x,y,z FROM tab1,tab2) _ist_ ein JOIN, auch wenn das Wort "JOIN" nirgendwo auftaucht. Oracle hat für JOINs eine andere Syntax - Oracle scheint mir sowieso in vielen Dingen ganz anders gestrickt zu sein, als z.B. mySQL.

Außerdem gings mir sowieso eher um die Formatierung;-)

Das ist voll angekommen.

SELECT
    tabelle1.feld1,
    tabelle1.feld2,
    tabelle1.feld3,
    tabelle1.feld4,
    tabelle2.feld1,
    tabelle2.feld2,
    tabelle2.feld3
  FROM
       tabelle1
     JOIN
       tabelle2
     ON
       tabelle1.id = tabelle2.foreignkey
  WHERE
     tabelle1.feld5 = 1
    AND
     tabelle1.feld6 > 1000

Ich würde sogar behaupten, die weiteren WHERE-Abfragen lassen sich auch noch in den ON-Teil integrieren. Vorteil ist Performancegewinn, da die entstehende Zwischentabelle kleiner ist.

Hmm, könntest Du einmal näher erläutern, wie Du Dir das so vorstellst?

Der Unterschied zwischen

SELECT x,y,z FROM tab1,tab2 WHERE tab1.id=tab2.id

und

SELECT x,y,z FROM tab1 LEFT JOIN tab2 ON tab1.id=tab2.id

(zumindest bei mySQL!) ist: Bei Version 1 wird zunächst eine Zwischentabelle angelegt, in der alle Einträge aus Tabelle 1 mit allen Einträgen aus Tabelle 2 verknüpft werden (wobei soviele Zeilen entstehen, wie das Produkt der Zeilen der beiden Tabellen groß ist. Hat tab1 100 Zeilen, und tab2 50, entstehen 100x50=5000 Zeilen). Aus dieser Tabelle werden dann alle Zeilen herausgefischt, welche der Bedingung entsprechen (die IDs sind gleich).

Bei Version 2 wird gleich beim Entstehen der Tabelle die Bedingung für die Zusammensetzung der Tabelle geprüft, es entstehen also garnicht erst soviele Zeilen, die hinterher wieder verworfen werden müssen.

Bei kleinen Tabellen macht das nichts aus (zumindest merkt man es nicht). Aber bei großen Tabellen dürfte es schon interessant sein, ob die Zwischentabelle nur 10.000 Zeilen groß ist (weil das die größte oder kleinste beteiligte Einzeltabellengröße ist, je nach Query), oder ob die Zwischentabelle 10.000x10.000=100.000.000 Zeilen groß ist.

- Sven Rautenberg