2016-09-27 1 views
0

Ich arbeite an einem verallgemeinerten Problem, wo ich nur Schema Definition von mehreren Tabellen, die ich habe.SQL JOIN OPTIMIZATION

Jetzt muss ich bestimmte Spalten abrufen, indem Sie mehrere Tabellen verbinden, so dass die Anzahl der Joins minimiert wird.

Beispiel: Angenommen, ich habe 3 Tabellen und hier ist die Liste der Spalten, die sie haben.

Tabelle 1: (1,2,3,4,5), Tabelle 2: (5,6,7), Tabelle 3: (5,6,7,8)

Nun nehme ich an, ich habe eine Abfrage, in der ich alle Spalten 1,2,3,4,5,6,7,8 möchte.

Jetzt kann ich beitreten entweder Tabelle 1, Tabelle 2 und Tabelle 3 OR Tabelle 1 und Tabelle 3 .Ich würden die erforderlichen Informationen in den beiden Fällen erhalten, aber Verbindungs ​​Tabelle 1 und Tabelle 3 erfordern würden nur 1 Tritt eher als 2 beitreten in anderen Fall.

Was ich versucht habe, war ein Greedy-Algorithmus, in dem ich zuerst Tabelle betrachten würde, die maximale Anzahl der erforderlichen Spalten dann die gemeinsamen Spalten zwischen der Abfrage und der Tabelle (aus Abfrage und Tabelle) und dann berücksichtigt aktualisierte Spalten und Tabellen aktualisieren und so weiter. Aber ich denke, es wäre langsam.

Also gibt es einen verallgemeinerten Algorithmus oder wenn mir irgendjemand einen Hinweis in diese Richtung geben kann?

+0

Die Aufgabe, wie es veröffentlicht wird, macht keinen Sinn in der SQL-Domäne. Derselbe Satz von Spaltennamen gewährleistet nicht den gleichen Inhalt. – Serg

Antwort

0

vor allem muss ich erwähnen, dass es nicht "beitreten", sondern "Union" ist. Dann muss ich erwähnen, dass, wenn Sie den Greedy-Algorithmus verwenden möchten, müssen Sie zuerst die 2 am kürzesten verbinden, denn wenn Sie eine Tabelle 2 Mal verbinden, wäre es von o (n), und Sie werden 2n haben Operationen zu tun, und so wäre es besser, wenn n so klein wie möglich wäre. Neben diesen kann der folgende Link für Sie nützlich sein: Merging 3 tables/queries using MS Access Union Query

+0

Es ist nur ein Join, da ich 2 Joins verwenden kann (ich kann Tabelle 1 und Tabelle 2 in Spalte 5 und dann Tabelle 2 und Tabelle 3 in Spalte 6 verbinden) oder einen einzelnen Join (Tabelle 1 und Tabelle 3 in Spalte 5)) um alle Spalten 1,2,3,4,5,6,7,8 zu erhalten –