SQL SQL Abfrage über mehrere Tabellen

Zhen

Lt. Junior Grade
Dabei seit
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 ;)
 

redasurc

Lieutenant
Dabei seit
Okt. 2010
Beiträge
941
Statt "select *" musst du die Spaltennamen angeben

select hersteller.bezeichnung, usw.
 
Zuletzt bearbeitet:

MP_H1tm4n

Cadet 4th Year
Dabei seit
Juni 2010
Beiträge
109
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...
 

dammit_horst

Banned
Dabei seit
Feb. 2009
Beiträge
120
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.
 

ranzassel

Lt. Junior Grade
Dabei seit
Feb. 2013
Beiträge
340
"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:

Zhen

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Aug. 2009
Beiträge
299
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.
 

ranzassel

Lt. Junior Grade
Dabei seit
Feb. 2013
Beiträge
340
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:

Zhen

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Aug. 2009
Beiträge
299
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.
 
Y

yxcv

Gast
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
 

Zhen

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Aug. 2009
Beiträge
299
@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 ;)
 

benneq

Admiral
Dabei seit
Juli 2010
Beiträge
9.001
Jeder halbwegs vernünftige DBMS optimiert das weg, also egal ob Oracle, MySQL oder Postgres ;)
 
Y

yxcv

Gast
@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.
 
Top