# Mehrere Tabellen zusammenführen



## miketech (6. Okt 2007)

Hi zusammen,

ich habe folgende 3 Tabellen mit diesem Schema:

Nr: String
Anzahl: Int

D.h. zu jeder Nummer gibt es eine Anzahl. z.B.:

5: 3 mal
2: 5 mal
12: 1 mal 

usw.

Von dieser Art habe ich nun 3 Tabellen A, B und C.

Ich möchte nun die Anzahlen von A und B addieren und die von C wieder abziehen.

(Datenbank ist übrigens MySQL).

Ich suche nun nach einer Möglichkeit das ganze performant durchzuführen. 

Also Bsp:

Tabelle A:
5: 3 mal
4: 1 mal

Tabelle B: 
5: 2 mal
4: 1 mal
3: 2 mal

Tabelle C:
5: 1 mal
4: 2 mal
3: 2 mal
2: 1 mal


Ergebnistabelle:

5: 4 mal
4: 0 mal
3: 0 mal
2: -1 mal


Ich könnte das jetzt manuell mit Addition und Subtraktion usw. durchführen mit ein paar Joins oder ich habe mir noch folgendes überlegt:

Ich führe 2 Unions aus, wobei ich die A und B normal verknüpfe und bei C die Anzahl * (-1) nehme und dann gruppiere mit der Sum-Aggregation.

Also sowas der Form:

Select Nr, Sum (Anzahl) From A Union B Union (select Nr, (Anzahl * (-1)) FROM C) Group by Nr;

Hat jemand eine Idee, wie ich das noch effizienter lösen kann?

Gruß

Mike


----------



## HoaX (6. Okt 2007)

so spontan: select a.anzahl + b.anzahl - c.anzahl from a left join b on (a.nr = b.nr) left join c on (a.nr = c.nr)


----------



## miketech (6. Okt 2007)

Yup, das wäre die erste Variante. Das ganze müsste man noch mit einem outer Join machen. Die Frage ist nur: Was ist schneller? Es geht hier nicht um 10 Datensätze, sondern mehrere Tausend 

Gruß

Mike


----------



## Gast (11. Okt 2007)

was spricht gegen ausprobieren und zeit loggen?


----------



## Gast (11. Okt 2007)

oh und wenn ich noch so darüber nachdenke, würde ich versuchen die Reihenfolge zu variieren.
Also Tabelle mit wenigsten Einträgen mit der Tabelle mit den zweitwenigsten einträgen und erst zuletzt Tabelle mit den meisten einträgen dazujoinen.

Was vllt auch noch helfen kann ist Nr als PK zu setzen, fals noch nicht geschehen und sonst nichts dagegenspricht. So kann man die DB evtl. dazu zwingen einen Index anzulegen, der beim joinen hilft. Ich weiß nur nicht ob das der MySql DB hilft.


----------

