# Tabellen Alias



## Times (3. Jul 2014)

Guten Tag liebe Community,

ich habe ein Problem mit dem ResultSetMetaData des ResultSets von java.sql:
Problem anhand eines Beispiels:

SQL:

```
SELECT WIEGESATZ.*, RECHEMPF.*, KUNDE.*, SPEDITEUR.*
FROM WIEGESATZ
LEFT JOIN ADRESSE AS RECHEMPF ON WIEGESATZ.RechEmpf = RECHEMPF.SysID 
LEFT JOIN ADRESSE AS KUNDE ON WIEGESATZ.Kunde = KUNDE.SysID
LEFT JOIN ADRESSE AS SPEDITEUR ON WIEGESATZ.Spediteur = SPEDITEUR.SysID;
```

In einer Tabelle WIEGESATZ gibt es 3 Felder... dem Rechnungsempfänger, dem Kunden, und einem Spediteur.. diese 3 sind FK und beziehen sich auf den PK der Tabelle ADRESSE.

Was soll erreicht werden/Wozu brauch ich den Alias?
Dynamische Darstellung der Daten auf der GUI.. so kann der Kunde selbst entscheiden welche Spalten er haben möchte, und welche nicht.

Lösungsweg bisher:
Da es in einigen Tabellen gleichnamige Felder gibt, oder auch wie oben beschrieben SQL-Statements mit mehreren Joins auf die selbe Tabelle geben kann muss der Alias-Name bei der Auswahl bekannt sein.

rsMeta ist die ResultSetMetaData des ResultSet's!


```
rsMeta.getTableName(col+1) + "." + this.rsMeta.getColumnLabel(col+1)
```

So bekomme ich z.B. "Material.Name", "Material.ID" etc!

Nun zum Problem:
der Befehl "getTableName(col:int)" vom ResultsetMetaData gibt mir IMMER nur den original Tabellen-Namen zurück, aber nicht den Alias-Tabellennamen, welchen ich in dem SQL-Statement (in den Joins) festgelegt habe.

Also ich bekomme immer "Adresse.Name" bei RechEmpf, Kunde sowie Spediteur.

Wenn ich debugge und mir die genauen Felder vom ResultSetMetaData anschaue, dann sehe ich unter der Variable "tableName" meinen gewünschten Alias-Namen, jeddoch gibt es keine Methode um diesen abzurufen.. (getTableName liefert die Variable "originalTableName" aus ResultsetMetaData!)

Gibt es also eine Möglichkeit an diese Variable zu gelangen?

Danke 

Falls ich mich zu undeutlich ausgedrückt habe, bitte Bescheid geben.. dann versuche ich es besser zu machen!


----------



## Times (15. Jul 2014)

Niemand ne Lösung?


----------



## Thallius (15. Jul 2014)

Ich würde die Tabellenspalten oderntlich benamsen. Dann entsteht auch kein gleicher Spaltenname und schon hast du keine Probleme mehr.

Zum Beispiel benennt man alle Spalten einer Tabelle "Adresse"

adrersse_name
adresse_vorname
etc...

Gruß

Claus


----------



## Times (15. Jul 2014)

Hallo Thallius,

ich glaube du hast mein Problem nicht richtig verstanden!
Es geht sich nicht um die Spaltennamen, sondern um den Alias der Tabelle welcher im JOIN entsteht
"...LEFT JOIN ADRESSE AS SPEDITEUR..." etc.

Bei deiner Lösung bräuchte ich dann für den Spediteur, dem Kunden und dem Rechnungsempfänger entweder jeweils dieselben Spalten oder 3x dieselbe Tabelle, aber danke dennoch für die Antwort 

Falls jemandem noch eine andere Lösung in den Sinn kommt, bitte hierher schreiben.. habe es vorerst wie folgt gelöst:
Habe unter MySQL 3 Views von der Tabelle angelegt.. aber diese Lösung möchte ich nur ungern beibehalten, da dies einfach nicht in das Gesamtschema passt!

Liebe Grüße

Times


----------



## Thallius (15. Jul 2014)

Was Du da sagst ergibt so einfach keinen Sinn. Wiso braucht man dreimal die gleiche Tabelle oder Spalten und was soll denn der Alias überhaupt bringen? Also ich kapiere Dein Konzept so nicht. 

Zeig doch mal wie deine Tabellen aussehen und erkläre was für Daten da drin sind und was genau du rausholen willst vielleicht verstehe ich es dann.

Gruß

Claus


----------



## Times (15. Jul 2014)

1. Ich habe einen Spediteur, einen Kunden und einen Rechnungsempfänger welche alle zB in einem Lieferschein erfasst werden.
Der Spediteur, der Kunde und der Rechnungsempfänger sind alles Adressen welche alle dieselben Grunddaten haben (Adressen wie: Name, Strasse, PLZ, Ort etc....).
Dazu gibt es eine Adressen-Tabelle. Über Checkboxen kann im Programm festgelegt werden was diese Adresse ist: Kunde, Spediteur, Rechnungsempfänger .. wobei eine Adresse auch alles drei sein KANN!

2. Im Lieferschein gibt es also 3 Spalten für einen Foreign-Key welcher sich immer auf dieselbe Adress-Tabelle bezieht.

3. Um nun für beispielsweise einen Lieferscheinausdruck alle Daten (Name, Strasse, PLZ, Ort etc....) von jeweils dem Spediteur, Rechnungsempfänger und Kunden ansprechen zu können mache ich 3 Joins auf dieselbe Tabelle, gebe aber den gejointen Tabellen einen Alias-Namen (Kunde, RechEmpf, Spediteur) - siehe SQL-Statement im 1. Beitrag!
An dieser Stelle alles kein Problem.

4. Mithilfe einer dynamischen Tabellenansicht (je nachdem was der Kunde gerade dargestellt haben möchte) kann er über eine Auswahl die gewünschte Spalte einstellen.. die Spalten die zur Verfügung stehen werden in einem Dropdown dargestellt.
Das Problem ist nun das ich um die Felder Name für Rechnungsempfänger, Spediteur und Kunde jeweils den Alias-Tabellen Namen brauche um die Felder anzusprechen damit es wie folgt aussieht:

Beispiel:
-RechEmpf.Name
-RechEmpf.Strasse
...
-Spediteur.Name
-Spediteur.Strasse
...
etc.


Momentan sieht es aber so aus:
-Adresse.Name
-Adresse.Strasse
....
-Adresse.Name
-Adresse.Strasse
...
etc.

Die verfügbaren Spaltennamen ermittle ich mir anhand einer For-Schleife welche über die ResultSetMetaData iteriert
mit der Methode: 
	
	
	
	





```
this.rsMeta.getColumnLabel(col+1)
```

Nun brauch ich aber noch den Alias-Tabellen Namen um auch das richige Feld anzusprechen... aber die Methode 

```
rsMeta.getTableName(col+1)
```
 liefert mir nur den Original-Tabellen Namen (Adresse) und nicht dne von mir vergebenen Alias-Tabellen Namen!


----------



## Thallius (16. Jul 2014)

Das kannst du aber auch nicht ändern. die sql Funktion getTableName(s) hat ja nichts mit einem Query zu tun. Die gibt halt einfach nur die in der Datenbank vorhandenen Tabellen zurück mehr nicht. Die weiß nichts von irgendwelchen Alias.

Irgendwie ist mir deine Logik auch immer noch zu hoch. Wenn alle drei Adresstypen (Lieferant, Spediteur, Wmpfänger) in der gleichen Tabelle stehen, dann haben sie ja auch alle die gleichen Spalten. Also kannst du doch einfach 3x diese Spalten dem User zum Auswählen anbieten. Beim Query ignoriest du diese Auswahl einfach. Ob Du da jetzt ein paar mehr einträge ausliest oder nicht sollte egal sein und beim Anzeigen nimmst du dann nur die Spalten die der User ausgewählt hat.

Gruß

Claus


----------



## Times (16. Jul 2014)

Thallius hat gesagt.:


> Die weiß nichts von irgendwelchen Alias.



Und genau da liegt das Problem... das ResultSetMetaData weiss nämlich den Alias (kann man im Debug-Modus sehen), gibt aber (noch) keine Methode um den abzurufen.
Ginge das vielleicht über Reflection irgendwie? Hab mich damit noch nicht wirklich viel auseinandergesetzt..
aber hab ich damit die Möglichkeit an ein privates Attribut eines bestehenden Objektes zu gelangen?

Lg Times


----------

