Suche auf lima-city
-
in: Effizienter SQL-Query
geschrieben von sl1nk
Hallo!
Folgendes Datenbankenmodel (DBMS: MySQL)
TableA <-> T2T <-> TableB TableC <-> T2T <-> TableD,
also ManyToMany-Relations zwischen allen Tabellen A,B,C,D über die T2T-Tabelle. (Die PKs der Tabellen A, B, C und D sind "über alle Tabellen" unique.) Wobei T2T die Eingräge ID und ID1 hat, und so die Tabellen related.
Ich bin jetzt auf der Suche nach einem effektiven SQL-Query der folgendes tut:
Alle Element aus TableA Joinen mit:
allen Elementen aus B, mit
allen Elementen aus C und D.
Also folgende Tupel sind erlaubt:
TableA TableB TableC TableD x NULL NULL NULL x x NULL NULL x NULL x x x x x x.
Mein etwas unglücklicher Ansatz in einem Query:
SELECT a.ID, b.ID, c.ID, d.ID FROM TableA a -- der relationen aufruf LEFT JOIN T2T t2t ON (T2T.ID1 = a.ID OR T2T.ID = a.ID) -- a -> t2t -> b LEFT JOIN TableB b ON (b.ID = t2t.ID OR b.ID = t2t.ID1) -- a -> t2t -> c -> u2u -> d LEFT JOIN TableC c ON (t2t.ID = c.ID OR t2t.ID1 = c.ID) INNER JOIN T2T u2u ON (u2u.ID = c.ID OR u2u.ID1 = c.ID) INNER JOIN TableD d ON (u2u.ID = d.ID OR u2u.ID1 = d.ID)
Anmerkung T2T hat die Einträge ID und ID1, da ich mir momentan nicht sicher bin, wie die Relationen gemappt werden, müssen momentan die teuren OR-Anweisungen herhalten. Sind die fest, ist mir klar, dass die Effizienz enorm steigt. (Ich hoffe ich hab beim Ändern der Namen keine Fehler eingebaut).
Das Problem hier ist, dass T2T TabelleA mit weiteren Tabellen mapped, die zwei LEFT JOINS bewirken also, dass unnötige Einträge gefetched werden.
Optimal wäre doch eine Kontrolle, dass mindestens TableB oder TableC einträge haben. Eine weitere möglichkeit wären ja 2 Abfragen (UNION) mit INNER JOIN für TableB und TableC, da werden die anderen Relationen rausgefilter.Gibt es einen effizienten Weg das in einem SQL-Query hinzubekommen? Und vllt. noch zusätzlich einen "schönen"? ;)
Grüße,
sl1nk