Zvoni
Erfahrenes Mitglied
Ich hatte jetzt schon in diversen Threads eine "Meinungsverschiedenheit" mit Yaslaw zu im Betreff genanntem Thema.
(Und "Meinungsverschiedenheit" nicht im Sinne von "Streit", sondern wortwörtlich: Unterschiedliche Meinungen).
Bitte nicht falsch verstehen: Ich habe höchsten Respekt vor Yaslaw und seinem Wissen und Fähigkeiten.
hab jetzt mal nen eigenen Thread aufgemacht hier, weil ich denke, dass es doch für den ein oder anderen dann nützliche Information darstellen kann.
Begriffe:
Was ist ein "Filter"?
Ein Filter in einem SQL-Statement ist eine Bedingung, welche vom Anwender mit einem (festen) Wert initiiert wird.
Beispiel:
Die "Meinungsverschiedenheit" zwischen mir und Yaslaw war, dass Yaslaw einen Filter in einer ON-Klausel ablehnt, während ich der Meinung bin, dass es vollkommen zulässig ist.
Ich hab daraufhin diese Frage in einem anderen Forum gestellt, habe auf den Antworten von dort basierend einen kleinen Test durchgeführt, und bin zu folgenden Ergebnis gekommen:
1) In einem INNER JOIN ist es egal, wo der Filter steht. Das Ergebnis ist dasselbe, ob der Filter in der ON-Klausel oder in der WHERE-Klausel steht. (In unten genanntem Beispiel einfach mal den LEFT JOIN mit einem INNER JOIN ersetzen)
2) Bei einem OUTER JOIN (Bsp. LEFT JOIN) ist es nicht egal!
Setze ich den Filter in die ON-Klausel, wird zuerst gefiltert, dann gejoint
Setze ich den Filter in die WHERE-Klausel, wird erst gejoint, dann gefiltert.
Die Ergebnis-Menge ist unterschiedlich.
3) Es absolut zulässig (auch im Rahmen der Logik) in der ON-Klausel einen Filter zu setzen.
Meinungen?
Für meinen Test (in SQLite) habe ich folgende Basis benutzt:
hier die zwei Testabfrage, bei welchen man den Unterschied sieht
(Und "Meinungsverschiedenheit" nicht im Sinne von "Streit", sondern wortwörtlich: Unterschiedliche Meinungen).
Bitte nicht falsch verstehen: Ich habe höchsten Respekt vor Yaslaw und seinem Wissen und Fähigkeiten.
hab jetzt mal nen eigenen Thread aufgemacht hier, weil ich denke, dass es doch für den ein oder anderen dann nützliche Information darstellen kann.
Begriffe:
Was ist ein "Filter"?
Ein Filter in einem SQL-Statement ist eine Bedingung, welche vom Anwender mit einem (festen) Wert initiiert wird.
Beispiel:
SQL:
SELECT ....... FROM Tabelle WHERE EinFeld=1 /*oder per Parameter*/
Die "Meinungsverschiedenheit" zwischen mir und Yaslaw war, dass Yaslaw einen Filter in einer ON-Klausel ablehnt, während ich der Meinung bin, dass es vollkommen zulässig ist.
Ich hab daraufhin diese Frage in einem anderen Forum gestellt, habe auf den Antworten von dort basierend einen kleinen Test durchgeführt, und bin zu folgenden Ergebnis gekommen:
1) In einem INNER JOIN ist es egal, wo der Filter steht. Das Ergebnis ist dasselbe, ob der Filter in der ON-Klausel oder in der WHERE-Klausel steht. (In unten genanntem Beispiel einfach mal den LEFT JOIN mit einem INNER JOIN ersetzen)
2) Bei einem OUTER JOIN (Bsp. LEFT JOIN) ist es nicht egal!
Setze ich den Filter in die ON-Klausel, wird zuerst gefiltert, dann gejoint
Setze ich den Filter in die WHERE-Klausel, wird erst gejoint, dann gefiltert.
Die Ergebnis-Menge ist unterschiedlich.
3) Es absolut zulässig (auch im Rahmen der Logik) in der ON-Klausel einen Filter zu setzen.
Meinungen?
Für meinen Test (in SQLite) habe ich folgende Basis benutzt:
SQL:
CREATE TABLE "Jobs" ("ID" INTEGER, "Description" TEXT);
CREATE TABLE "Jobs2" ("ID" INTEGER,"Description2" TEXT);
INSERT INTO "main"."Jobs" ("ID", "Description") VALUES ('1', 'Job1');
INSERT INTO "main"."Jobs" ("ID", "Description") VALUES ('2', 'Job2');
INSERT INTO "main"."Jobs" ("ID", "Description") VALUES ('3', 'Job3');
INSERT INTO "main"."Jobs" ("ID", "Description") VALUES ('4', 'Job4');
INSERT INTO "main"."Jobs" ("ID", "Description") VALUES ('5', '');
INSERT INTO "main"."Jobs" ("ID", "Description") VALUES ('6', 'Job6');
INSERT INTO "main"."Jobs" ("ID", "Description") VALUES ('7', 'Job7');
INSERT INTO "main"."Jobs" ("ID", "Description") VALUES ('8', '');
INSERT INTO "main"."Jobs" ("ID", "Description") VALUES ('9', 'Job9');
INSERT INTO "main"."Jobs2" ("ID", "Description2") VALUES ('1', 'Job1');
INSERT INTO "main"."Jobs2" ("ID", "Description2") VALUES ('2', 'Job2');
INSERT INTO "main"."Jobs2" ("ID", "Description2") VALUES ('3', 'Job3');
INSERT INTO "main"."Jobs2" ("ID", "Description2") VALUES ('4', 'Job2');
INSERT INTO "main"."Jobs2" ("ID", "Description2") VALUES ('6', 'Job6');
INSERT INTO "main"."Jobs2" ("ID", "Description2") VALUES ('7', 'Job2');
INSERT INTO "main"."Jobs2" ("ID", "Description2") VALUES ('9', 'Job9');
hier die zwei Testabfrage, bei welchen man den Unterschied sieht
SQL:
SELECT T1.ID, T1.Description, T2.ID, T2.Description2
FROM Jobs AS T1 LEFT JOIN Jobs2 AS T2
ON T1.ID=T2.ID AND T2.Description2='Job2'
SQL:
SELECT T1.ID, T1.Description, T2.ID, T2.Description2
FROM Jobs AS T1 LEFT JOIN Jobs2 AS T2
ON T1.ID=T2.ID
WHERE T2.Description2='Job2'
Zuletzt bearbeitet: