Tabellenname als Variable?
am 07.12.2006 10:51:41 von Jan Schmidt
Hallo,
eine DB hat eine Tabelle, die Tabellennamen in numerischen ID's
abbildet. Diese Nummer steht jetzt in einer anderen Tabelle mit der
zu der Tabelle zugehörigen ID.
Ich möchte das ganze jetzt auflösen. Da fällt mir eigentlich nur ein,
den Tabellennamen in eine Variable zu schreiben. Leider funktioniert
die zweite Select-Anweisung nicht.
Ich vermute, daà ich den Inhalt der Variable nicht als Tabellenname
verwenden kann.
select @einzel_ID:=2;
SELECT @table:=Tabellen_Name from `pruefschritte` where Einzel_ID=@einzel_ID;
select * FROM `Ausfaelle` as aus, @table as ps where aus.Einzel_ID=@einzel_ID and aus.Pruef_ID=ps.Pruef_ID
Gibts da eine Möglichkeit mit sql-Bordmitteln oder muà ich ein
externes Programm schreiben (Achja, Version ist 4.0.21)?
GruÃ,
Jan
Re: Tabellenname als Variable?
am 07.12.2006 15:59:37 von Thomas Rachel
Jan Schmidt wrote:
> Ich möchte das ganze jetzt auflösen. Da fällt mir eigentlich nur ein,
> den Tabellennamen in eine Variable zu schreiben. Leider funktioniert
> die zweite Select-Anweisung nicht.
> Ich vermute, daà ich den Inhalt der Variable nicht als Tabellenname
> verwenden kann.
Stimmt. (A
Ich sehe da zwei Möglichkeiten, wie Du weiter verfahren könntest:
- den Tabellennamen applikationsseitig in eine Variable lesen und dann in
den nächsten Query verwursten
oder
- die gesamte Datenbankstruktur so umgestalten, daà Du alles, was über
diese - ich nenne sie mal Sekundärtabellen - läuft, über eine einzige
Tabelle laufen lassen mit einer zusätzlichen Spalte, die die
Zugehörigkeit zu den Tabellen angibt.
Was ich damit meine:
Angenommen, Deine bisherige Tabellenstruktur sieht so aus:
Tabelle pruefschritte mit den Spalten Einzel_ID und Tabellen_Name
Tabelle Ausfaelle mit den Spalten Einzel_ID und Pruef_ID
n Tabellen mit mindestens der Spalte Pruef_ID (mehr geht aus Deinen
Angaben nicht hervor)
Diese n Tabellen könntest Du in eine Tabelle verfrachten, die auÃer den
Spalten aus den genannten Tabellen noch eine Spalte besitzt, die die
Zugehörigkeit zur alten Tabelle angibt. Dazu könnte sich beispielsweise
die Einzel_ID eignen.
Spinnen wir mal weiter:
Die Sequenz
create temporary table pruefschritte (Einzel_ID int, Tabellen_Name
char(4));
create temporary table Ausfaelle (Einzel_ID int, Pruef_ID int);
create temporary table aaa (Pruef_ID int);
create temporary table bbb (Pruef_ID int);
insert into pruefschritte (Einzel_ID,Tabellen_Name)
values (1,'aaa'),(2,'bbb');
insert into Ausfaelle (Einzel_ID,Pruef_ID)
values (1,3),(1,5),(2,4),(2,6);
insert into aaa (Pruef_ID)
values (3),(5);
insert into bbb (Pruef_ID)
values (4),(6);
Dann könntest Du die Tabellen aaa und bbb zusammenfassen zu Tabelle
sammel, die so aussieht:
create temporary table sammel (Tabellen_Name char(4), Pruef_ID int);
insert into sammel (Tabellen_Name, Pruef_ID)
values ('aaa',3),('aaa',5),('bbb',4),('bbb',6);
was natürlich nicht schön normalisiert ist. Zum Normalisieren könntest Du
die Tabelle pruefschritte verwenden:
create temporary table sammel (
Einzel_ID int, -- identifiziert die "Tabelle"
Pruef_ID int
);
insert into sammel (Einzel_ID, Pruef_ID)
values (1,3),(1,5),(2,4),(2,6);
oder, sofern ich die Struktur doch falsch verstehe oder man sich ein
zusätzliches Stück Flexibilität bewahren will (worum es bei diesen
Tabellen genau geht, blicke ich leider nicht so ganz), eine separate
Normalisierungstabelle erstellen.
Kommt natürlich drauf an, was momentan so an Anwendungen drumrumliegt
(bist Du noch in der Designphase, sollte es leicht zu ändern sein, gibnt
es bereits ein umfangreiches Anwendungspaket, wirds eher schwierig...)
Der von Dir gewünschte Query sollte dann so gehen:
select @einzel_ID:=2;
select * FROM `Ausfaelle` as aus JOIN sammel as ps USING
(Einzel_ID,Pruef_ID)
where aus.Einzel_ID=@einzel_ID; -- wirkt dank JOIN auch auf sammel
Oder eben...
> Gibts da eine Möglichkeit mit sql-Bordmitteln oder muà ich ein
> externes Programm schreiben (Achja, Version ist 4.0.21)?
.... in einem bereits bestehenden Programm einfach umsetzen. Sollte das
nicht gehen, weil Du bisher nur mit mysql-Aufrufen und statischen
SQL-Dateien gearbeitet hast, wird es zwar schwierig, aber nicht
unmöglich.
[Jetzt wirds offtopic:]
Du müÃtest aus der Shell heraus zunächst den Tabellennamen ermitteln:
tabname=`mysql -NB -e "
-- select @einzel_ID:=2; -- geht hier nicht, weil es eine Ausgabe liefert
-- stattdessen:
set @einzel_ID=2;
SELECT Tabellen_Name from `pruefschritte` where Einzel_ID=@einzel_ID;
"`
mysql -e "
select @einzel_ID:=2; -- ja, nochmal - ist ja ein anderer Aufruf
-- der von dem anderen nix weiÃ
select * FROM
`Ausfaelle` as aus,
$table as ps -- $table ist Shellvariable!
where aus.Einzel_ID=@einzel_ID and aus.Pruef_ID=ps.Pruef_ID
"
[noch offtopicner:]
Solltest Du aus diesem Grund auf eine andere Sprache umsteigen wollen,
könntest Du bspw. Python verwenden. Dort gibnge das dann innerhalb einer
Datenbankverbindung wie folgt:
import MySQLdb
d=MySQLdb.connect([nötige Parameter])
c=d.cursor()
c.execute("set @einzel_ID=%s",2)
c.execute("SELECT Tabellen_Name from `pruefschritte` where
Einzel_ID=@einzel_ID")
Tabname=c.fetchone()[0]
Query="""select * FROM `Ausfaelle` as aus, %s as ps
where aus.Einzel_ID=@einzel_ID and aus.Pruef_ID=ps.Pruef_ID""" % Tabname
c.execute(Query)
[...]
c.close()
d.close()
HTH,
Thomas
--
Ein Gorilla ist eigentlich eine auf Bäumen weidende Kuh.
Re: Tabellenname als Variable?
am 04.01.2007 20:05:40 von markus bretscher
Hallo,
deine Freunde heissen prepare stmt, execute stmt, deallocate prepare
Die genaue Syntax ist im Mysql-Referenz HB beschrieben.
Die Statements gelten für Mysql5.x. Ob sie auch für V4.x gelten,
weiss ich nicht.
Gruss
Markus
Jan Schmidt schrieb:
> Hallo,
>
> eine DB hat eine Tabelle, die Tabellennamen in numerischen ID's
> abbildet. Diese Nummer steht jetzt in einer anderen Tabelle mit der
> zu der Tabelle zugehörigen ID.
>
> Ich möchte das ganze jetzt auflösen. Da fällt mir eigentlich nur ein,
> den Tabellennamen in eine Variable zu schreiben. Leider funktioniert
> die zweite Select-Anweisung nicht.
>
> Ich vermute, daà ich den Inhalt der Variable nicht als Tabellenname
> verwenden kann.
>
> select @einzel_ID:=2;
> SELECT @table:=Tabellen_Name from `pruefschritte` where Einzel_ID=@einzel_ID;
> select * FROM `Ausfaelle` as aus, @table as ps where aus.Einzel_ID=@einzel_ID and aus.Pruef_ID=ps.Pruef_ID
>
> Gibts da eine Möglichkeit mit sql-Bordmitteln oder muà ich ein
> externes Programm schreiben (Achja, Version ist 4.0.21)?
>
> GruÃ,
> Jan