# SQL - Dynamisch die Tabelle in From-Klausel bestimmen



## miketech (27. Jul 2007)

Hi zusammen,

ich möchte eine SQL Abfrage auf einer Tabelle ausführen, die aber selbst noch dynamisch bestimmt werden soll. Also folgendes:

select table_name from stock order by year limit 1

liefert mir den Tabellen-Namen. Diesen möchte ich nun in einer SQL-Abfrage verwenden, also sowas in der Art:

select * from (select table_name from stock order by year limit 1)

Das funktioniert aber leider nicht. Hat jemand eine Idee, wie ich sowas hinbekommen könnte? Ich möchte eine View erstellen und die View soll immer auf einer Tabelle basieren, die selbst dynamisch bestimmt werden soll.

Gruß

Mike


----------



## P3AC3MAK3R (27. Jul 2007)

Erster Gedanke: Prepared Statements

http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html


----------



## miketech (27. Jul 2007)

Hi,

naja, ich wollte ohne Java auskommen. Mir ging es um reines SQL. Die View soll sich quasi automatisch aktualisieren.

Gruß

Mike


----------



## P3AC3MAK3R (27. Jul 2007)

Das war natürlich nicht zu vermuten und immerhin hast Du ja auch im JDBC-Forum gepostet. 

Auf welche Datenbank beziehst Du Dich?


----------



## miketech (27. Jul 2007)

Hab hier kein anderes DB-Forum gefunden und dachte, dass es hier doch sicher Leute gibt, die sich damit auskennen 

Ist eine MySQL Datenbank. 

Gruß

Mike


----------



## abollm (27. Jul 2007)

miketech hat gesagt.:
			
		

> Hab hier kein anderes DB-Forum gefunden und dachte, dass es hier doch sicher Leute gibt, die sich damit auskennen
> 
> Ist eine MySQL Datenbank.
> 
> ...



Na ja, die Frage vom Friedensmacher war aber schon berechtigt, denn abhängig vom RDBMS hast du da natürlich schon einige -- stark unterschiedliche Möglichkeiten.

In Oracle fällt mir spontan das Thema NDS dazu ein.


----------



## Yzebär (27. Jul 2007)

Wenn du so etwas brauchst, solltest du mal deine DB-Struktur mal überdenken. Beschreib doch einfach mal, was du vorhast, wir können dir sicher noch hilfreiche Tips geben.


----------



## abollm (27. Jul 2007)

Yzebär hat gesagt.:
			
		

> Wenn du so etwas brauchst, solltest du mal deine DB-Struktur mal überdenken. Beschreib d[..].



Ich glaube, dass man das so pauschal nicht sagen kann, denn ansonsten hätten sich die DB-Hersteller eben nicht bestimmte Möglichkeiten des dynamischen SQL ausgedacht.


----------



## bronks (27. Jul 2007)

miketech hat gesagt.:
			
		

> ... select * from (select table_name from stock order by year limit 1) ...


Das klappt nur mit MySql V >= 4.irgenwas und dann mußt Du Aliase für die SubQuery verwenden:

```
select * from (select table_name from stock order by year limit 1) as x
```


----------



## miketech (27. Jul 2007)

Hi,

also dynamic SQL klingt schonmal interessant, weiß nur noch nicht, ob das mein Problem löst. Lese mich grad etwas ein.

Also folgendes: Ich habe eine Tabelle mit Daten. Diese Daten werden regelmäßig aufbereitet und in eine extra Tabelle gespeichert. Es existieren für verschiedene Zeiträume verschiedene Tabellen mit aufbereiteten Daten. Und ich möchte nun eine View erstellen, die auf der aktuellsten Tabellen mit den aufbereiteten Daten operiert. 

Um überhaupt zu wissen, welche die aktuellste Tabelle ist, habe ich eine andere Tabelle, die jeweils den Zeitpunkt und den Tabellen-Namen beinhaltet. 

D.h. hier müsste man nachschauen: Welches ist die aktuellste Tabelle? Und dann muss auf dieser operiert werden. 

Und wo ich das so schreibe fällt mir eine Alternative ein: Ich könnte der aktuellsten Tabelle immer denselben Namen geben. Und später benenne ich diese Tabelle um. D.h. wenn ich Tabellen der Form habe: stock_2002, stock_2003 etc. mach ich eine stock_current und verwende diese in der View. 

Ist zwar nicht genau das, was ich mir vorgestellt habe, aber wäre eine Lösung. Ich möchte die Logik, die später in der View ablaufen wird eben in der Datenbank haben und nicht in der Anwendung. Sonst wäre das alles überhaupt kein Problem. Die View verarbeitet Transaktionsdaten zusammen mit den archivierten aktuellen Daten. Und damit ich das nicht in zig Anwendungen immer wieder schreiben muss, soll dieser Teil in einer View auf Datenbank-Ebene ablaufen.

Gruß

Mike

Edit: Oder ich habe halt noch eine View "stock_current", die auf die aktuelle Tabelle verweist. Dann kann ich mit der View weiterarbeiten. Aber würde mich ja trotzdem interessieren, ob mein ursprüngliches Problem irgendwie zu lösen ist


----------



## Yzebär (28. Jul 2007)

Warum schreibst du nicht alle Daten in eine Tabelle und versiehst die zusammengehörigen Datensätze mit einer zusätzlichen ID bzw mehreren zusätzlichen Kennungen?

Auf dem MS SQl-Server kann man übrigens ein SQL-Statement als String zusammenbasteln und dann ausführen. Sowas würde ich aber nur für dynamische Update-Skripte (Änderung der Tabellenstrukturen etc) verwenden und nicht für select-Statements.


----------



## miketech (28. Jul 2007)

Hi,

das sind ziemlich viele Daten, die in einem gewissen Zeitraum aufkommen und später verarbeitet werden müssen. Aus Gründen der Übersichtlichkeit und auch Performance möchte ich die Daten trennen, weil sie einfach nicht so richtig zusammengehören. Es sind meist Daten von einem ganzen Jahr, die zusammenkommen. Ein Zusammenschmeißen würde dem Sinn (auf semantischer Ebene) nicht ganz gerecht werden, auch wenn es technisch möglich wäre.

Gruß

Mike


----------

