Join mit zusätzlicher Bedingung
Michael
- datenbank
Hallo zusammen!
Ich möchte mittels JOIN zwei Tabellen miteinander verknüpfen.
Allerdings möchte ich nicht alle Werte aus Tabelle 1 mit Tabelle 2
verknüpfen, sondern nur die, die als "id_objekt" in Tabelle 1 eine "1"
eingetragen haben. Über
SELECT * FROM Tabelle_1 LEFT JOIN Tabelle_2 ON Tabelle_1.id=Tabelle_2.id
verknüpfe ich beide Tabellen. Ich bräuchte einen Ergänzung in der Form
WHERE Tabelle_1.id_objekt=1
Id_objekt ist nicht in Tabelle_2 enthalten. Ich muss JOIN verwenden,
da der Eintrag in Tabelle_2 auch NULL sein kann.
Schonmal vielen Dank für die Hilfe
hi,
SELECT * FROM Tabelle_1 LEFT JOIN Tabelle_2 ON Tabelle_1.id=Tabelle_2.id
verknüpfe ich beide Tabellen. Ich bräuchte einen Ergänzung in der Form
WHERE Tabelle_1.id_objekt=1
SELECT * FROM Tabelle_1 LEFT JOIN Tabelle_2 ON Tabelle_1.id=Tabelle_2.id
HAVING Tabelle_1.id_objekt=1
?
gruß,
wahsaga
yo,
SELECT * FROM Tabelle_1 LEFT JOIN Tabelle_2 ON Tabelle_1.id=Tabelle_2.id
HAVING Tabelle_1.id_objekt=1
HAVING wird nur in verwendung von GROUP BY verwendet und schließt datensätze aus den gruppierungen aus, wobei auch aggregat-funktionen eingesetzt werden können. ich würde die zusätzliche bedingung einfach in das JOIN kriterium mit reinnehmen.
SELECT * FROM Tabelle_1 LEFT JOIN Tabelle_2 ON (Tabelle_1.id=Tabelle_2.id AND Tabelle_1.id_objekt=1)
Ilja
Hi,
SELECT * FROM Tabelle_1 LEFT JOIN Tabelle_2 ON (Tabelle_1.id=Tabelle_2.id AND Tabelle_1.id_objekt=1)
ist das performanter als der Gebrauch der guten alten WHERE-Klausel? (Schoen fuer die Augen ist es aber nicht.)
Gruss,
Ludger
yo,
ist das performanter als der Gebrauch der guten alten WHERE-Klausel? (Schoen fuer die Augen ist es aber nicht.)
nicht das ich wüsste, da in aller regel alle join anweisung sowieso in die where klausel verschoben werden. manchmal muss man es in die join bedingung mit reinnehmen, wenn es sich um die zweite tabelle handelt. allerdings habe ich das so geschrieben, weil der ursprungsposter quasi ja schon das mit dem where selbst erwähnt hat. was soll man da dann noch sagen....
Ilja
Hi,
[...] allerdings habe ich das so geschrieben, weil der ursprungsposter quasi ja schon das mit dem where selbst erwähnt hat. was soll man da dann noch sagen....
keine Ausreden! ;-)
(Deine Beitraege sind sowieso "M$-verhunzt" - wie kommst Du auf die Idee, dass Grossgeschriebenes == Kleingeschriebenes gilt?)
Dann zur Query:
SELECT * FROM Tabelle_1 LEFT JOIN Tabelle_2 ON (Tabelle_1.id=Tabelle_2.id AND Tabelle_1.id_objekt=1)
Hier rege ich an die sog. Keitlinghaus-Notation zu verwenden, also stattdessen
SELECT
*
FROM
Tabelle1
LEFT JOIN
Tabelle_2 ON (Tabelle_2.id = Tabelle_1.id) -- man beachte den Unterschied!
WHERE
(Tabelle_1.id_objekt = 1)
zu schreiben. (Wenn ich daran denke, was ich alles schon so an SQL-Code zur Bearbeitung bekommen habe. Baehhh! - Wenn einer nicht mal vernuenftigen Code "normalisieren" kann, wie wird er denn dann die Datenhaltung managen, frage ich mich immer. (Dein Code war ja noch recht schoen. ;-))
Gruss,
Ludger
yo,
(Deine Beitraege sind sowieso "M$-verhunzt" - wie kommst Du auf die Idee, dass Grossgeschriebenes == Kleingeschriebenes gilt?)
ich würde sagen, das habe ich mehr aus dem englischen. ich bin ein fan von der kleinschreibung und dazu noch ein kleiner rebell, quasi das kind im mann. regeln sind normalerweise nicht gottgegeben, sondenr von menschen aufgestellt. und brauchen tun wir letztlich beides, leute die sie einhalten und die sie brechen.
Hier rege ich an die sog. Keitlinghaus-Notation zu verwenden, also stattdessen
ich würde mich da an den optimierer des jweiligen dbms orientieren und der kann sehr unterschiedlich sein.
Ilja
Hi,
ich würde sagen, das habe ich mehr aus dem englischen. ich bin ein fan von der kleinschreibung und dazu noch ein kleiner rebell, quasi das kind im mann. regeln sind normalerweise nicht gottgegeben, sondenr von menschen aufgestellt. und brauchen tun wir letztlich beides, leute die sie einhalten und die sie brechen.
klar, Bestehendes muss immer wieder auf seine Existenzberechtigung geprueft werden. (Ist ja auch gut fuer Dich, musst Du weniger Tasten druecken. Leider nicht so gut fuer die Anderen. Rechnet sich also nicht.)
Hier rege ich an die sog. Keitlinghaus-Notation zu verwenden, also stattdessen
ich würde mich da an den optimierer des jweiligen dbms orientieren und der kann sehr unterschiedlich sein.
Was oder wen meinst Du damit?
Gruss,
Ludger
yo,
Ist ja auch gut fuer Dich, musst Du weniger Tasten druecken. Leider nicht so gut fuer die Anderen. Rechnet sich also nicht.
für mich rechnet es sich schon und alles andere ist eine sache der gewöhnung. in england klappt es jau auch und die würden sich wundern, wenn man nun auf einmal vieles gross schreiben würde. ist also alles nur eine frage der perspektive.
Was oder wen meinst Du damit?
den optimierer meine ich.
Ilja
Hi,
Was oder wen meinst Du damit?
den optimierer meine ich.
der (weisungsbefugte?) Optimierer des jeweiligen RDBMS, an dem Du i.p. Datenzugriff mitmischt? - Ich kenne diese Rolle nicht, ist das vielleicht einfach "der Chef"? ;-)
Gruss,
Ludger
Hallo Ludger,
Was oder wen meinst Du damit?
den optimierer meine ich.
der (weisungsbefugte?) Optimierer des jeweiligen RDBMS, an dem Du i.p. Datenzugriff
mitmischt? - Ich kenne diese Rolle nicht, ist das vielleicht einfach "der Chef"? ;-)
Eine Query durchlaeuft (wie jede Sprache bei jedem Interpreter -- naja, gut, fast jede
Sprache bei fast jedem Interpreter) verschiedene Phasen. Eine davon ist das “Optimizing“,
und das Code-Stueck, das die Optimierungen durchfuehrt, wird “Optimizer” oder halt
“Optimierer” genannt.
Grüße,
CK
Hi,
Eine Query durchlaeuft (wie jede Sprache bei jedem Interpreter -- naja, gut, fast jede
Sprache bei fast jedem Interpreter) verschiedene Phasen. Eine davon ist das “Optimizing“,
und das Code-Stueck, das die Optimierungen durchfuehrt, wird “Optimizer” oder halt
“Optimierer” genannt.
und wie heisst der "Optimierer" von M$ SQL Server und was hat das mit der Notation von SQL-Statements zu tun?
Gruss,
Ludger
Hallo Ludger,
Eine Query durchlaeuft (wie jede Sprache bei jedem Interpreter -- naja, gut, fast jede
Sprache bei fast jedem Interpreter) verschiedene Phasen. Eine davon ist das “Optimizing“,
und das Code-Stueck, das die Optimierungen durchfuehrt, wird “Optimizer” oder halt
“Optimierer” genannt.und wie heisst der "Optimierer" von M$ SQL Server [...]
“Optimierer” oder auch “Optimizer”.
[...] und was hat das mit der Notation von SQL-Statements zu tun?
Abhaengig von der Notation koennen sich die Ausfuehrungsplaene gewaltig aendern und damit
auch die Moeglichkeiten des Optimizers zu optimieren.
Grüße,
CK
Hi,
und wie heisst der "Optimierer" von M$ SQL Server [...]
“Optimierer” oder auch “Optimizer”.
ich kenne nur diese Geschichte mit den Ausfuehrungsplaenen, denen ich nicht besonders traue, beim Query Analyzer. Aber Du meinst was anderes, oder?
[...] und was hat das mit der Notation von SQL-Statements zu tun?
Abhaengig von der Notation koennen sich die Ausfuehrungsplaene gewaltig aendern und damit
auch die Moeglichkeiten des Optimizers zu optimieren.
Was verstehst Du unter Notation?
Gruss,
Ludger
Hallo Ludger,
und wie heisst der "Optimierer" von M$ SQL Server [...]
“Optimierer” oder auch “Optimizer”.
ich kenne nur diese Geschichte mit den Ausfuehrungsplaenen, denen ich nicht besonders
traue, beim Query Analyzer. Aber Du meinst was anderes, oder?
Ja, ich meine etwas anderes. Der Optimizer hat die Aufgabe, die Ausfuehrungsplaene zu
optimieren. Der Optimizer wuerde z. B. in jedem Fall ein »WHERE 1 = 1« wegoptimieren.
Oder auch die Reihenfolge von Joins zu bestimmen (die ja fuer die Performance recht
massgeblich ist) gehoert zu seinen Aufgaben.
[...] und was hat das mit der Notation von SQL-Statements zu tun?
Abhaengig von der Notation koennen sich die Ausfuehrungsplaene gewaltig aendern und damit
auch die Moeglichkeiten des Optimizers zu optimieren.Was verstehst Du unter Notation?
In dem Fall: die verschiedenen Moeglichkeiten, mit verschiedenen Queries das gleiche
Resultset zu bekommen.
Grüße,
CK
Hi,
Ja, ich meine etwas anderes. Der Optimizer hat die Aufgabe, die Ausfuehrungsplaene zu
optimieren. Der Optimizer wuerde z. B. in jedem Fall ein »WHERE 1 = 1« wegoptimieren.
Oder auch die Reihenfolge von Joins zu bestimmen (die ja fuer die Performance recht
massgeblich ist) gehoert zu seinen Aufgaben.
wenn Du mir jetzt noch verraten koenntest was ilja (moeglicherweise ;-) gemeint hat?
Gruss,
Ludger
Hallo Ludger,
Ja, ich meine etwas anderes. Der Optimizer hat die Aufgabe, die Ausfuehrungsplaene zu
optimieren. Der Optimizer wuerde z. B. in jedem Fall ein »WHERE 1 = 1« wegoptimieren.
Oder auch die Reihenfolge von Joins zu bestimmen (die ja fuer die Performance recht
massgeblich ist) gehoert zu seinen Aufgaben.wenn Du mir jetzt noch verraten koenntest was ilja (moeglicherweise ;-) gemeint hat?
Er sagte, dass er die genaue Notation vom DBMS und seinem Optimizer abhaengig machen wuerde.
Grüße,
CK