# Über Joins mehrere Schlüssel aus einer Tabelle auflösen



## Taggert (15. Dez 2008)

Hallo Jungs und Mädels,

ich hab mal ne Frage zu SQL Joins.

Ich versuch mir eine View zu bauen, die alle relevanten Daten für eine Tabelle enthält.  Da eine SQL Engine viel besser dazu geeignet ist, die Fremdsschlüssel aufzulösen, als das mit Java möglich wäre benutze ich LEFT JOINS.

Also nun mal Konkret.  Ich habe eine Tabelle mit relativ vielen Schlüsselund will mir diese Schlüssel zu aussagefähigen Namen (für den Benutzer verständliche) mittels einer View umbauen.

Hier eine kleine Auszug aus dem ganzen Ding

-----------------------
| Artikel                |
-----------------------
| ID                      |
| ArtikelName        |
|HerstellerID         |
|Atrribut1ID          |
|Attribut2ID           |
-----------------------

-----------------------
|Hersteller             |
-----------------------
|HerstellerID         |
HerstellerName      |
------------------------

-----------------------
|Attribut                |
-----------------------
|AttributID            |
|AttributeName      |
-----------------------

So weit so gut.  Ich bekomm die Tabelle der aufgelösten Hersteller ID mit dem folgenden SQL Befehl

select artikelid,herstellername from Artikel
   LEFT JOIN Hersteller ON artikel.ID = hersteller. herstellerID

Das ganze funktioniert auch mit dem ersten Attribut
select artikelid,herstellername,attributeName from Artikel
   LEFT JOIN Hersteller ON artikel.ID = hersteller. herstellerID
   LEFT JOIN Hersteller ON artikel.attribute1ID = attribut. attributeID

Wenn ich das ganze jetzt aber mit dem zweiten Attribut aufrufen will, dann kracht es, da ich ja nun zwei Spalten habe, die AttributeName heißen.  Wie krieg ich dieses Problem in den Griff?


----------



## SlaterB (16. Dez 2008)

allgemein kann man Tabellen Bezeichner geben:

select x.a, y.a from table1 x, table2 y


----------



## Taggert (16. Dez 2008)

das ist mir klar, aber ich versteh nicht genau, worauf du raus willst. Die Tabellen heisst ja immer noch so.  Ob ich jetzt schreib select attribute.attributID, attribute.attributId oder nur attributeID,attributeID kommt doch auf das selbe raus


----------



## maki (16. Dez 2008)

select artikelid as wasauchimmer,herstellername as firma from Artikel


----------



## Taggert (16. Dez 2008)

Ich bekomm leider immer noch den Fehler:
Not unique table/alias: 'attributeName'


Also hier ist, was ich jetzt geschrieben hab:

select artikelid,herstellername,
   attributeName AS attributeName1, 
   attributeName AS attributeName2 
from Artikel

LEFT JOIN Hersteller ON artikel.ID = hersteller. herstellerID
LEFT JOIN Attribut ON artikel.attribute1ID = attribut. attributeID 
LEFT JOIN Attribut ON artikel.attribute2ID = attribut. attributeID


----------



## SlaterB (16. Dez 2008)

der Fehler beschreibt genau das, was ich geantwortet habe, wie kann man das nur so ignorieren..,
bei joins ist die Schreibweise freilich evtl. schwieriger:

select a.artikelid, h.herstellername,
x.attributeName AS attributeName1,
y.attributeName AS attributeName2
from Artikel a
LEFT JOIN Hersteller h ON a.ID = h. herstellerID
LEFT JOIN Attribut x ON a.attribute1ID = x. attributeID
LEFT JOIN Attribut y ON a.attribute2ID = y. attributeID

oder vielleicht
"LEFT JOIN Attribut as y"
siehe SQL-Syntax, evtl. DB-abhängig


----------



## Taggert (16. Dez 2008)

Danke Dir SlaterB, jetzt versteh ich was Du mir sagen wolltest.  Vielen Dank für Deine Hilfe, ich werd es gleich probieren.


----------



## Taggert (16. Dez 2008)

hat fast geklappt - ich habs noch etwas umgebaut, dann lief es wie Schmieröl.

Hier mein Code für die Lösung, aber auf die Idee wäre ich ohne Deine Hilfe nie gekommen.

select a1.itemattribute AS attrib1, a2.itemattribute AS attrib2 from artikel
LEFT JOIN itemattribute AS a1 ON artikel.attributeid1 = a1.itemattributeid
LEFT JOIN itemattribute AS a2 ON artikel.attributeid2 = a2.itemattributeid


Vielen Dank für Eure Hilfe, ohne Euch hät ich es nicht geschafft.
Liebe Grüße
Taggert


----------

