SQL SQL Abfrage über mehrere Tabellen

Zhen

Lt. Junior Grade
Registriert
Aug. 2009
Beiträge
299
Hallo Leute,
hätte da ein kleines Problemchen bei dem ich nicht so ganz verstehen woher das überhaupt auftritt... :rolleyes:

Ich habe mehrere Tabellen z.B. (Hersteller, Model, Ean, Kategorie und Produkt)

Die ersten 4 Tabellen sind alle gleich aufgebaut:

PHP:
ID | Bezeichnung
// z.B. Tabelle Hersteller
1 | Fujitsu
2 | Microsoft
3 | Logitec

Die Produkttabelle ist dann folgendermassen aufgebaut

PHP:
ID | Hersteller_ID | Modell_ID | EAN_ID | Kategorie_ID
// Beispiel Datensatz
// ID: 1 | Hersteller: Fujitsu | Modell: Esprimo P400 | EAN: 4051554485894 | Kategorie: Computer
1 | 1 | 3 | 2 | 1

Nun wollte ich mit Hilfe einer SQL Anweisung erreichen, dass meine Ausgabe in etwa so aussieht:
(die Spaltenüberschriften müssen allerdings nicht sein. Die Beschreibung muss nur eingeblendet werden)

PHP:
ID | Hersteller | Modell | EAN | Kategorie
//Beispiel
1 | Fujitsu | Esprimo P400 | 4051554485894  | Computer

Dabei hab ich schon einiges ausprobiert, aber immernoch nicht zum gewünschten Ergebnis gekommen.

PHP:
// Bei dieser Anweisung bekomm ich den Fehler:
// Der mehrteilige Bezeichner 'Hardware.Hersteller_ID' konnte nicht gebunden werden.
SELECT * FROM Hersteller, Modell, Ean, Kategorie
WHERE 
	Hersteller.ID = Hardware.Hersteller_ID AND 
	Modell.ID = Hardware.Modell_ID AND
	Ean.ID = Hardware.EAN_ID AND
	Kategorie.ID = Hardware.Kategorie_ID;

// Hier funktioniert weder die AND-Anweisung noch ein Komma als Trennung
// "Falsche Syntax in der Nähe des AND-Schlüsselworts. " bzw. "Falsche Syntax in der Nähe von ','."
SELECT * FROM Hardware
INNER JOIN Hersteller AND Modell
ON Hardware.Hersteller_ID = Hersteller.ID, Hardware.Model_ID = Modell.ID;


In Sachen Datenbanken bin ich ehrlich gesagt bislang eine Null. Ist das erste mal dass ich in diesem Bereich etwas mache.

Hoffe ihr könnt mir weiterhelfen ;)
 
Statt "select *" musst du die Spaltennamen angeben

select hersteller.bezeichnung, usw.
 
Zuletzt bearbeitet:
Soweit ich weiß ist folgendes nicht möglich:

SELECT * FROM Hardware
INNER JOIN Hersteller AND Modell
ON Hardware.Hersteller_ID = Hersteller.ID, Hardware.Model_ID = Modell.ID;

stattdessen müsstest du 2 mal joinen:
SELECT * FROM Hardware
INNER JOIN Hersteller
ON Hardware.Hersteller_ID = Hersteller.ID
INNER JOIN model ON...
 
@redasurc

müsste aber auch so gehen, da du ja alles auswählst und das Datenbanksystem dies erkennen sollte.
 
SELECT * FROM Hardware
INNER JOIN Hersteller ON Hardware.Hersteller_ID = Hersteller.ID
INNER JOIN Modell ON Hardware.Model_ID = Modell.ID;

das sollte glaube ich funktionieren.
 
"Der Bezeichner konnte nicht gebunden werden" kommt daher, dass die Tabelle HERSTELLER in deiner FROM-Klausel fehlt. Du kannst nur Tabellen im WHERE verwenden, die im FROM bekannt gemacht wurden.

Die Sache mit dem INNER JOIN hat dammit_horst ja schon korrekt angegeben.
 
Zuletzt bearbeitet:
Cool Master schrieb:
@redasurc

müsste aber auch so gehen, da du ja alles auswählst und das Datenbanksystem dies erkennen sollte.

Stimmt, eigentlich hat der TE 2 Probleme, einmal die JOIN Syntax und einmal die richtige Benennung der Spalten im Select, damit nur die gewünschten Infos angezeigt werden. Zur JOIN Syntax habe ich nichts geanwortet.
 
Also das mit mehreren JOINS funktioniert schon mal annährend, aber ist leider immernoch nicht
das gewünschte Ergebnis.

Mit mehreren INNER JOIN's sieht es nämlich so aus:

PHP:
ID | Hersteller_ID | Modell_ID | EAN_ID | Kategorie_ID | ID | Bezeichnung | ID | Hersteller_ID | Bezeichnung | ID | Nummer | ID | Bezeichnung

//Entspricht:
1 | 1 | 3 | 2 | 1 | 1 | Fujitsu | 3 | 2 | Esprimo P400 | 2 | 4051554485894 | 1 | Computer
Ergänzung ()

Folgendes hab ich nun auch probiert... ebenfalls nichts als Fehler... -_-"

PHP:
SELECT 
	Hersteller.Bezeichnung, 
	Modell.Bezeichnung, 
	Modell.Version, 
	Ean.Nummer,
	Kategorie.Bezeichnung 
FROM 
	Hersteller, 
	Modell, 
	Ean, 
	Produktnummer, 
	Kategorie
INNER JOIN Hardware 
	ON Hardware.Hers_ID = Hersteller.ID
INNER JOIN Hardware 
	ON Hardware.Model_ID = Modell.ID
INNER JOIN Ean 
	ON Hardware.EAN_ID = Ean.ID
INNER JOIN Kategorie 
	ON Hardware.Kategorie_ID = Kategorie.ID

Fehler:
Meldung 4104, Ebene 16, Status 1, Zeile 15
Der mehrteilige Bezeichner 'Hersteller.ID' konnte nicht gebunden werden.
Meldung 1013, Ebene 16, Status 1, Zeile 1
Die Objekte 'Hardware' und 'Hardware' in der FROM-Klausel haben denselben verfügbar gemachten Namen. Verwenden Sie abhängige Namen, um sie voneinander zu unterscheiden.
 
Nee... jetzt mischt du zwei Sachen. Es gibt zwei Arten einen INNER JOIN zu schreiben. Nehmen wir mal das Beispiel Hardware und Hersteller.

Kannst du einmal schreiben:

PHP:
SELECT *
  FROM Hardware, Hersteller
 WHERE hardware.hersteller_id = hersteller.id

ODER

PHP:
SELECT *
  FROM hardware
     INNER JOIN hersteller ON hardware.hersteller_id = hersteller.id

Liefert Beides das selbe Ergebnis, sind nur unterschiedliche Schreibweise. Beides mischen geht nicht! Wenn du INNER JOIN verwendest befindet sich hinter dem FROM nur deine führende Tabelle.


Edit: Und im Idealfall verwendest du nicht * sondern benennst jede Spalte einzeln die du benötigst. Erspart dir merkwürdige Fehler, wenn du irgendwann mal zusätzliche Spalten in deinen Tabellen einführst.
 
Zuletzt bearbeitet:
Ok vielen Dank für eure Hilfe :)

Folgende Anweisung hat nun funktioniert...

PHP:
SELECT 
	H.Bezeichnung AS Hersteller,
	M.Bezeichnung AS Modell, 
	M.Version AS "Version", 
	E.Nummer AS EAN, 
	P.Bezeichnung AS Produktnummer,
	K.Bezeichnung AS Kategorie
FROM 
	Hersteller AS H,
	Modell AS M,
	Ean AS E,
	Produktnummer AS P,
	Kategorie AS K,
	Hardware AS HW
WHERE
	H.ID = HW.Hers_ID AND
	M.ID = HW.Model_ID AND
	E.ID = HW.EAN_ID AND
	P.ID = HW.ProduktNr AND
	K.ID = HW.Kategorie_ID;

Ich blick das zwar immernoch nicht 100 %ig durch mit dem JOIN, aber
es geht :D werd mich noch bisschen mehr damit beschäftigen ;)

Vielen Dank nochmals.
 
Hallo Zhen,

Tabellen sollten niemals per WHERE-Befehl verbunden werden.
Weil andernfalls
- schnell der Überblick verloren geht wie die Tabellen zusammenhängen,
- kein Left/Right Joins möglich (weil im Where NULL-Werte standardmäßig ignoriert werden)
- die Abfrage länger dauert, da alle Kombinationen erstellt und erst anschließend die passenden Datensätze behalten werden.

So ist das ganze besser nachzuvollziehen und durch das LEFT JOIN wird auch die Hardware angezeigt,
bei denen evtl. eines der Merkmale noch nicht in der jeweiligen Tabelle angelegt ist.

PHP:
SELECT 
	 H.Bezeichnung	AS Hersteller
	,M.Bezeichnung 	AS Modell
	,M.Version 	AS "Version"
	,E.Nummer 	AS EAN
	,P.Bezeichnung 	AS Produktnummer
	,K.Bezeichnung 	AS Kategorie
FROM Hardware AS HW
LEFT JOIN Hersteller AS H
	ON H.ID = HW.Hers_ID
LEFT JOIN Modell AS M		
	ON M.ID = HW.Model_ID
LEFT JOIN Ean AS E
	ON E.ID = HW.EAN_ID
LEFT JOIN Produktnummer AS P
	ON P.ID = HW.ProduktNr
LEFT JOIN Kategorie AS K
	ON K.ID = HW.Kategorie_ID
 
@yxcv: Vielen Dank für den Hinweis und die weitere JOIN-Methode :)

Das hat mir weitergeholfen und auch etwas mehr Verständnis über JOINS gebracht ;)
 
Jeder halbwegs vernünftige DBMS optimiert das weg, also egal ob Oracle, MySQL oder Postgres ;)
 
@Drexel und benneque,
ist eure Sache, wenn ihr darauf vertraut eure fehlende Kompetenz durch die Datenbank-Intelligenz ausbügeln zu lassen...

Zhen weiß aber nun wie SQL-Befehle übersichtlich und leicht verständlich aufzubauen sind
und kann zukünftig auch komplexe Abfrage problemlos nachvollziehen und mögliche Probleme schnell lokalisieren.

Wünsche ein schönes Wochenende.
 
Zurück
Oben