Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Join über 4 Tabellen, Fehler: not unique table


BLR - Do 26.08.10 17:21
Titel: Join über 4 Tabellen, Fehler: not unique table
Hallo, ich würde gerne für mein Programm aus 3 Join-Abfragen eine machen. Diese 3 Join-Abfragen funktionieren einzeln, also kann es eigentlich nicht an der DB-Aufbau liegen.
2 Joins habe ich bereits zusammengeführt aber bei der dritten habe ich irgendwie Probleme mit der Klammer (nehme ich an)

Abfrage über 3 Tabellen mit 2 Joins


SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
select re_positionen.ID_Pos, rechnung.RechnungsNummer,
rechnung.Datum, artikel.Artikel_Bezeichnung
from (re_positionen
join rechnung on re_positionen.FK_RE_ID = rechnung.ID_RE
and rechnung.ID_RE = 3)
join artikel on artikel.ID_Art = re_positionen.FK_Art_ID
where artikel.ID_Art = 45


Nun Abfrage über 4 Tabellen mit 3 Joins

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
select re_positionen.ID_Pos, rechnung.RechnungsNummer,
rechnung.Datum, artikel.Artikel_Bezeichnung, kunde.Name, kunde.Vorname
from ((re_positionen
join rechnung on re_positionen.FK_RE_ID = rechnung.ID_RE
and rechnung.ID_RE = 3
rechnung join kunde on rechnung.FK_Kunde_ID = kunde.ID_Kunde)
join artikel on artikel.ID_Art = re_positionen.FK_Art_ID
where artikel.ID_Art = 45)
join kunde on rechnung.FK_Kunde_ID = kunde.ID_Kunde
and rechnung.FK_Kunde_ID = 4


Fehler: #1066 - Not unique table/alias: 'rechnung'

Ich nehme an, er hat Probleme mit 2 Zeilen:

SQL-Anweisung
1:
join rechnung on re_positionen.FK_RE_ID = rechnung.ID_RE                    

und

SQL-Anweisung
1:
join kunde on rechnung.FK_Kunde_ID = kunde.ID_Kunde                    


Ich habe die RechnungsID als Fremdschlüsse in der RE_Positionen
Und KundenID als Fremdschlüssel in der Tabelle Rechnung...
P.S fall die DB gebraucht wird, kann ich gern ein DB-Diagramm machen.
Danke für die Ratschläge :)


Trashkid2000 - Do 26.08.10 19:26

Hi,

habe das ganze mal ausprobiert.

Also, in Deinem Statement ist 2x ein Join auf die Tabelle Kunde. Weiss nicht, ob das Absicht oder ein Versehen war, aber so funktioniert das nicht.
Habe es mal umgeschrieben, das ist das Ergebnis:


SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
SELECT      
          re_positionen.ID_Pos, 
          rechnung.RechnungsNummer,
          rechnung.Datum, 
          artikel.Artikel_Bezeichnung, 
          kunde.Name,
          kunde.Vorname
FROM        
          re_positionen 
INNER JOIN  rechnung ON re_positionen.FK_RE_ID = rechnung.ID_RE AND rechnung.ID_RE = 3
INNER JOIN  artikel ON artikel.ID_Art = re_positionen.FK_Art_ID AND artikel.ID_Art = 45
INNER JOIN  kunde ON kunde.ID_Kunde = rechnung.FK_Kunde_ID AND rechnung.FK_Kunde_ID = 4;

oder übersichtlicher, so finde ich:

SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
SELECT  
      re_positionen.ID_Pos, 
      rechnung.RechnungsNummer,
      rechnung.Datum, 
      artikel.Artikel_Bezeichnung, 
      kunde.Name,
      kunde.Vorname
FROM  
      re_positionen,
      rechnung,
      artikel,
      kunde
WHERE  
      re_positionen.FK_RE_ID = rechnung.ID_RE AND
      artikel.ID_Art = re_positionen.FK_Art_ID AND
      kunde.ID_Kunde = rechnung.FK_Kunde_ID AND
      rechnung.ID_RE = 3 AND
      artikel.ID_Art = 45 AND
      rechnung.FK_Kunde_ID = 4;


Kann sein, dass ich bei den Spaltenbezeichnern was verplant habe, da diese manchmal sehr komisch sind.

Viel Spaß damit,

Marko


BLR - Do 26.08.10 21:44

ohh cool, danke, das war genau mein Fehler, hab da aus versehen was überflüssiges reingeschrieben


Trashkid2000 - Do 26.08.10 21:47

Hab ich gern gemacht

Marko