Discussion:
Subselect durch Join ersetzen?
(zu alt für eine Antwort)
Andreas Volz
2005-05-29 09:36:38 UTC
Permalink
Hi,

ich bearbeite gerade einige SQL-Übungsaufgaben. Durch MySQL bin ich
nicht so geübt im ausführen von Subselects. In der Musterlösung ist oft
ein Subselect genutzt. Aber mir ist aufgefallen, dass ich bisher alle
duch Joins ersetzen konnte. Kann man daraus ableiten, dass alle
Subselects im Prinzip durch Joins ersetzt werden können? Oder ist das
bisher evtl. durch die Einfachheit meiner Aufgaben der Fall? Kann mir
jemand gerade ein Beispiel einer Anfrage nennen die man nur mit einem
Subselects aber nicht mit einen Join stellen kann?

Gruß
Andreas
Andreas Volz
2005-05-29 10:04:12 UTC
Permalink
Post by Andreas Volz
ich bearbeite gerade einige SQL-Übungsaufgaben. Durch MySQL bin ich
nicht so geübt im ausführen von Subselects. In der Musterlösung ist
oft ein Subselect genutzt. Aber mir ist aufgefallen, dass ich bisher
alle duch Joins ersetzen konnte. Kann man daraus ableiten, dass alle
Subselects im Prinzip durch Joins ersetzt werden können? Oder ist das
bisher evtl. durch die Einfachheit meiner Aufgaben der Fall? Kann mir
jemand gerade ein Beispiel einer Anfrage nennen die man nur mit einem
Subselects aber nicht mit einen Join stellen kann?
Hm, mittlerweile hab ich noch einige Beispiele mehr gemacht und glaube
es gibt Subselects die sich nicht durch Joins ersetzen lassen. Ohne
jetzt direkt auf die konkrete Abfrage einzugehen. Kann man da eine
generelle Aussage zur Ersetzbarbeit von Subselect->Join oder
Join->Subselect machen?

Gruß
Andreas
Sven Paulus
2005-05-29 11:12:56 UTC
Permalink
Post by Andreas Volz
Hm, mittlerweile hab ich noch einige Beispiele mehr gemacht und glaube
es gibt Subselects die sich nicht durch Joins ersetzen lassen. Ohne
Ich glaube, z.B. folgenden Select bekaeme man aufgrund der doppelten
sequenziellen Gruppierung nicht durch Joins ersetzt:

mysql> select * from abc;
+------+------+
| a | b |
+------+------+
| a | 5 |
| a | 3 |
| b | 8 |
| c | 4 |
| c | 6 |
| d | 5 |
+------+------+
6 rows in set (0.00 sec)

mysql> select y, count(*) from ( select a x, sum(b) y from abc group by a ) test group by y;
+------+----------+
| y | count(*) |
+------+----------+
| 5 | 1 |
| 8 | 2 |
| 10 | 1 |
+------+----------+
3 rows in set (0.00 sec)

Also zaehlen, wie haeufig die gleiche Summe fuer gleichen Buchstaben
zugeordneten Werten auftaucht. Frag mich aber nicht, fuer was man das
brauchen koennte :)
Fabian Schladitz
2005-05-30 05:42:30 UTC
Permalink
Post by Andreas Volz
Post by Andreas Volz
ich bearbeite gerade einige SQL-Übungsaufgaben. Durch MySQL bin ich
nicht so geübt im ausführen von Subselects. In der Musterlösung ist
oft ein Subselect genutzt. Aber mir ist aufgefallen, dass ich bisher
alle duch Joins ersetzen konnte. Kann man daraus ableiten, dass alle
Subselects im Prinzip durch Joins ersetzt werden können? Oder ist das
bisher evtl. durch die Einfachheit meiner Aufgaben der Fall? Kann mir
jemand gerade ein Beispiel einer Anfrage nennen die man nur mit einem
Subselects aber nicht mit einen Join stellen kann?
Hm, mittlerweile hab ich noch einige Beispiele mehr gemacht und glaube
es gibt Subselects die sich nicht durch Joins ersetzen lassen. Ohne
jetzt direkt auf die konkrete Abfrage einzugehen. Kann man da eine
generelle Aussage zur Ersetzbarbeit von Subselect->Join oder
Join->Subselect machen?
Ich kann keine generelle Aussage treffen. Aber: es gibt definitiv
SubSelects, die sich nicht durch Joins ersetzen lassen.
Weiterhin gibt es SubSelects, die dafür Sorgen, dass eine Abfrage in
einem SQL-Statement Platz hat, wofür vorher zwei Abfragen und
Programmlogik "drumrum" nötig waren.
--
HTH,
Fabian
Harald Fuchs
2005-05-30 08:57:10 UTC
Permalink
Post by Fabian Schladitz
Post by Andreas Volz
Hm, mittlerweile hab ich noch einige Beispiele mehr gemacht und glaube
es gibt Subselects die sich nicht durch Joins ersetzen lassen. Ohne
jetzt direkt auf die konkrete Abfrage einzugehen. Kann man da eine
generelle Aussage zur Ersetzbarbeit von Subselect->Join oder
Join-> Subselect machen?
Post by Fabian Schladitz
Ich kann keine generelle Aussage treffen. Aber: es gibt definitiv
SubSelects, die sich nicht durch Joins ersetzen lassen.
Weiterhin gibt es SubSelects, die dafür Sorgen, dass eine Abfrage in
einem SQL-Statement Platz hat, wofür vorher zwei Abfragen und
Programmlogik "drumrum" nötig waren.
... wobei sich die "Programmlogik drumrum" oft durch temporäre
Tabellen ersetzen läßt. Je nach Optimierer bekommt man damit sogar
manchmal schneller das Ergebnis als durch ein Subselect.

Loading...