Supportnet / Forum / Datenbanken
Problem mit SQL - Abfrage
Frage
Hallo,
ich greife über die ODBC - Schnittstelle auf eine access-Datenbank zu. Ich möchte nun mit einer SQL-Abfrage einen bestimmten Datensatz abfragen.... wenn ich es nach dem Schema SELECT * FROM tabelle1 mache, funktioniert alles ohne Probleme,.
Bei folgender Abfrage sagt er mir aber, das ich einen Fehler in der FROM - Klausel habe und ich kann die Abfrage sooft durchschauen, wie ich möchte, ich finde einfach keinen fehler.... vielleicht könnt ihr mir ja weiterhelfen!!
Hier ist die SQL - Abfrage:
[code]SELECT spalteX, spalteY FROM TabelleX JOIN TabelleY ON spalteX = spalteY WHERE spalteZ.TabelleY LIKE ´BLA´ [/code]
Hoffe, ihr könnt mir weiterhelfen...!!!
Gruß
Sashka
Antwort 1 von ditsch
Versuchs mal mit
SELECT TabelleX.spalteX, TabelleY.spalteY FROM TabelleX , TabelleY WHERE TabelleX.spalteX = TabelleY.spalteY and TabelleY.spalteZ LIKE ´BLA´
SELECT TabelleX.spalteX, TabelleY.spalteY FROM TabelleX , TabelleY WHERE TabelleX.spalteX = TabelleY.spalteY and TabelleY.spalteZ LIKE ´BLA´
Antwort 2 von Sashka
danke für die schnelle Antwort!
Wenn ich das so mache, sagt er mir Syntaxfehler in Abfrageausdruck TabelleX.spalteX
so scheint es also auch incht zu gehen....hatte es auch schon mal so ähnlich ausprobiert....
Wenn ich das so mache, sagt er mir Syntaxfehler in Abfrageausdruck TabelleX.spalteX
so scheint es also auch incht zu gehen....hatte es auch schon mal so ähnlich ausprobiert....
Antwort 3 von disco
moin
also On hab ich glaub ich noch nie benutzt.
ich würds so machen:
SELECT sX,sY FROM tX JOIN tY WHERE tX.sX = tY.sY AND tY.sZ = "bla";
ggf. musste doppelte auswürfe durch GROUP BY kompensieren.
sag wenn geholfen hat.
g,
disco
also On hab ich glaub ich noch nie benutzt.
ich würds so machen:
SELECT sX,sY FROM tX JOIN tY WHERE tX.sX = tY.sY AND tY.sZ = "bla";
ggf. musste doppelte auswürfe durch GROUP BY kompensieren.
sag wenn geholfen hat.
g,
disco
Antwort 4 von ElBobbele
Hi sashka!
Dem JOIN-Ausdruck muss ein INNER, LEFT oder RIGHT vorangestellt werden. Ausserdem hast du im ON-Abschnitt nur die Feldnamen aufgelistet. An dieser Stelle muss immer eine Kombination aus Tabellen- und Feldname aufgeführt werden. Der dritte Fehler ist in der Bedingung, "TabelleY" und "spalteZ" müssen ihre Plätze tauschen.
Die richtige SQL-Anweisung schaut demnach so aus:
Problematische Abfragen solltest du vielleicht mit dem Abfrageeditor in Access erzeugen, der ist bequem zu bedienen. Anschließend kannst du dir den fertigen SQL-Ausdruck in der SQL-Ansicht herauskopieren.
Gruss
El Bobbele
Dem JOIN-Ausdruck muss ein INNER, LEFT oder RIGHT vorangestellt werden. Ausserdem hast du im ON-Abschnitt nur die Feldnamen aufgelistet. An dieser Stelle muss immer eine Kombination aus Tabellen- und Feldname aufgeführt werden. Der dritte Fehler ist in der Bedingung, "TabelleY" und "spalteZ" müssen ihre Plätze tauschen.
Die richtige SQL-Anweisung schaut demnach so aus:
SELECT spalteX, spalteY
FROM TabelleX INNER JOIN TabelleY ON TabelleX.spalteX = TabelleY.spalteY
WHERE TabelleY.spalteZ LIKE ´BLA´ Problematische Abfragen solltest du vielleicht mit dem Abfrageeditor in Access erzeugen, der ist bequem zu bedienen. Anschließend kannst du dir den fertigen SQL-Ausdruck in der SQL-Ansicht herauskopieren.
Gruss
El Bobbele
Antwort 5 von draack
Hi,
es ist ein klassicher Fehler in diesem Fall ´LIKE´ zu benutzen. Du verwendest überhaupt kein Jokerzeichen (´%´). Du machst einen einfachen Vergleich. Dafür reicht ´=´.
Das sollte funktionieren (ist auch mit älteren SQL-Standards ohne ´JOIN´ konform).
Tschö,
Volker
es ist ein klassicher Fehler in diesem Fall ´LIKE´ zu benutzen. Du verwendest überhaupt kein Jokerzeichen (´%´). Du machst einen einfachen Vergleich. Dafür reicht ´=´.
SELECT TabelleX.spalteX, TabelleX.spalteY
FROM TabelleX, TabelleY
WHERE TabelleX.spalteX = TabelleY.spalteY
AND TabelleY.spalteZ = ´BLA´ Das sollte funktionieren (ist auch mit älteren SQL-Standards ohne ´JOIN´ konform).
Tschö,
Volker
Antwort 6 von Sashka
Hallo,
habe die letzte Möglichkeit getestet, da es aber wieder nicht funktionierte, habe ich mir noch zwei test-tabellen angelegt.
Dafür sieht die Abfrage wie folgt aus:
Hier funktioniert es ohne Probleme, es gibt keine Fehlermeldung und es werden auch die richtigen ergebnisse ausgegeben.
Dann habe ich alles nocheinmal schritt für schritt auf meine eigentlichen tabellen übertragen, das sieht wie folgt aus:
rein theoretisch müsste es ja Funktionieren..... tut es aber leider nicht. Als Fehlermeldung bekomme ich "Syntaxfehler in Abfrageausdruck ´041206_MatVersionen_Infos.MAT_OBID = 041206_Material_Infos.OBID AND 041206_Material_Infos.PARTNUMBER = ´test455545´!
Also genau das, was hinter dem WHERE steht.
könnte es irgendwie an den bezeichnungen liegen, das die evtl. zu lang sind o.ä., das er das nicht mag!?
Gruß
Sashka
habe die letzte Möglichkeit getestet, da es aber wieder nicht funktionierte, habe ich mir noch zwei test-tabellen angelegt.
Dafür sieht die Abfrage wie folgt aus:
SELECT test_1, test_3 FROM tabelle1, tabelle2 WHERE tabelle1.test_1 = tabelle2.test_3 AND tabelle2.test_4 = ´test4´
Hier funktioniert es ohne Probleme, es gibt keine Fehlermeldung und es werden auch die richtigen ergebnisse ausgegeben.
Dann habe ich alles nocheinmal schritt für schritt auf meine eigentlichen tabellen übertragen, das sieht wie folgt aus:
SELECT MAT_OBID, OBID
FROM 041206_MatVersionen_Info, 041206_Material_Infos
WHERE 041206_MatVersionen_Infos.MAT_OBID = 041206_Material_Infos.OBID
AND 041206_Material_Infos.PARTNUMBER = ´test455545´
rein theoretisch müsste es ja Funktionieren..... tut es aber leider nicht. Als Fehlermeldung bekomme ich "Syntaxfehler in Abfrageausdruck ´041206_MatVersionen_Infos.MAT_OBID = 041206_Material_Infos.OBID AND 041206_Material_Infos.PARTNUMBER = ´test455545´!
Also genau das, was hinter dem WHERE steht.
könnte es irgendwie an den bezeichnungen liegen, das die evtl. zu lang sind o.ä., das er das nicht mag!?
Gruß
Sashka
Antwort 7 von draack
Hi,
ich kann keinen Fehler in meiner Abfrage erkennen - allerdings vermisse ich in deiner immer noch die Tabellennamen vor den Spaltennamen nach dem "SELECT". Du musst schon genau sagen, aus welcher Tabelle die Spalte denn kommen soll ...
Tschö,
Volker
ich kann keinen Fehler in meiner Abfrage erkennen - allerdings vermisse ich in deiner immer noch die Tabellennamen vor den Spaltennamen nach dem "SELECT". Du musst schon genau sagen, aus welcher Tabelle die Spalte denn kommen soll ...
Tschö,
Volker
Antwort 8 von Sashka
hi,
eigentlich sollte es ja egal sein, ob die Tabellennamen davor stehen oder nicht, wenn die Bezeichnungen eindeutig sind....! Wenn ich alles ab dem WHERE weglasse, funktioniert es ja auch.... also weiß er ja, welche Spaltennamen gemeint sind...!
Und in den Test-Tabellen funktioniert es ja auch, ohne das ich die Tabellen explizit angebe, also wird da nicht der Fehler liegen.... ;-)
Gruß
Sashka
eigentlich sollte es ja egal sein, ob die Tabellennamen davor stehen oder nicht, wenn die Bezeichnungen eindeutig sind....! Wenn ich alles ab dem WHERE weglasse, funktioniert es ja auch.... also weiß er ja, welche Spaltennamen gemeint sind...!
Und in den Test-Tabellen funktioniert es ja auch, ohne das ich die Tabellen explizit angebe, also wird da nicht der Fehler liegen.... ;-)
Gruß
Sashka
Antwort 9 von ThomasG
Nur ein Schreibfehler?
SELECT MAT_OBID, OBID
FROM 041206_MatVersionen_Info, 041206_Material_Infos WHERE 041206_MatVersionen_Infos
.MAT_OBID = 041206_Material_Infos.OBID
AND 041206_Material_Infos.PARTNUMBER = ´test455545´
Gruß
Thomas
SELECT MAT_OBID, OBID
FROM 041206_MatVersionen_Info, 041206_Material_Infos WHERE 041206_MatVersionen_Infos
.MAT_OBID = 041206_Material_Infos.OBID
AND 041206_Material_Infos.PARTNUMBER = ´test455545´
Gruß
Thomas
Antwort 10 von Sashka
ja, den schreibfehler habe ich schon bemerkt und das in meiner Abfrage berichtigt (nur hier habe ich es nicht berichtigt)....aber daran liegt es nicht, der Fehler tritt leider weiterhin auf... :-(
Antwort 11 von ThomasG
Hallo,
ich würde Dir ein SQL - Statement erstellen wenn Du mir genau beschreibst was Du benötigst!
Also, Du hast z.Bsp. 2 Tabellen die über ein Schlüsselfeld miteinander verbunden sind. Aus einer dieser Tabelle willst Du dann Daten ziehen mit einer bestimmten Bedingung. Felder der anderen Datei sollen im Ergebnis angezeigt werden.
Wenn das so richtig ist, dann brauche ich mal Dein Tabellen- und Feldnamen.
Gruß
Thomas
ich würde Dir ein SQL - Statement erstellen wenn Du mir genau beschreibst was Du benötigst!
Also, Du hast z.Bsp. 2 Tabellen die über ein Schlüsselfeld miteinander verbunden sind. Aus einer dieser Tabelle willst Du dann Daten ziehen mit einer bestimmten Bedingung. Felder der anderen Datei sollen im Ergebnis angezeigt werden.
Wenn das so richtig ist, dann brauche ich mal Dein Tabellen- und Feldnamen.
Gruß
Thomas
Antwort 12 von Hinki27
Hallo Sashka,
sind die zwei Felder für die Beziehung von gleichen Typ? Die Verschiedenen angeführten Verfahren (JOIN, WHERE) sind alle korrekt.
Gruß
Ralf
sind die zwei Felder für die Beziehung von gleichen Typ? Die Verschiedenen angeführten Verfahren (JOIN, WHERE) sind alle korrekt.
Gruß
Ralf
Antwort 13 von Sashka
@ ThomasG: Ja, das ist in etwa das, was ich vorhatte. Mit den SQL-Statements habe ich "eigentlich" keine größeren Probleme, weil ich das ja auch in der Schule durchnehme, aber irgendwie will es nicht so wirklich klappen und ich weiß leider nicht warum, habe die Abfrage auch schon Mitschülern und meinem Lehrer (bei dem wir gerade SQL-durchnehmen und der auch wirklich ahnung davon hat) gezeigt, aber alle meinten, das es so völlig korrekt ist und eigentlich funktionieren müsste....!
Aber du kannst gerne einmal dein Glück Probieren ;-)
Also, ich habe die Tabelle 041206_MatVersionen_Infos von der ich die spalte MAT_OBID mit der spalte OBID von der Tabelle 041206_Material_Infos verknüpfen will/muss (z.B. mit ´nem JOIN) die sind auch beide von gleichen Typ und es steht exakt das gleiche drin.... und dann möchte ich, das nur die Datensätze ausgegeben werden, wo ein String-Wert gleich dem wert von der Spalte PARTNUMBER der Tabelle 041206_Material_Infos ausgegeben werden...... wegen mir können in dem Statement auch alle Datensätze einer Tabelle ausgegeben werden, also ala SELECT * FROM 041206_Material_Infos .... das auswählen der Spalten sollte ich ja noch selbst hinkriegen ;-)
@ Hinki27: Ja, die sind beide vom gleichen Typ, sprich es sind einfache Textfelder/strings/varchar, was auch immer.... (also in access steht das es Typ "Text" ist.... ;-)
Gruß
Sashka
Aber du kannst gerne einmal dein Glück Probieren ;-)
Also, ich habe die Tabelle 041206_MatVersionen_Infos von der ich die spalte MAT_OBID mit der spalte OBID von der Tabelle 041206_Material_Infos verknüpfen will/muss (z.B. mit ´nem JOIN) die sind auch beide von gleichen Typ und es steht exakt das gleiche drin.... und dann möchte ich, das nur die Datensätze ausgegeben werden, wo ein String-Wert gleich dem wert von der Spalte PARTNUMBER der Tabelle 041206_Material_Infos ausgegeben werden...... wegen mir können in dem Statement auch alle Datensätze einer Tabelle ausgegeben werden, also ala SELECT * FROM 041206_Material_Infos .... das auswählen der Spalten sollte ich ja noch selbst hinkriegen ;-)
@ Hinki27: Ja, die sind beide vom gleichen Typ, sprich es sind einfache Textfelder/strings/varchar, was auch immer.... (also in access steht das es Typ "Text" ist.... ;-)
Gruß
Sashka
Antwort 14 von Hinki27
Hallo Sashka,
setze um deine Tabellennamen im Where-Kriterium "[" und "]", oder nimm die Ziffernfolge "041206_" aus den Tabellenbezeichnungen und der Abfrage raus. Die Felder benutze ohne vorangestellten Tabellennamen. Bei meinem Test hat das geholfen.
SELECT MAT_OBID,OBID
FROM 041206_MatVersionen_Info, 041206_Material_Infos
WHERE ((([041206_MatVersionen_Info].MAT_OBID)=[041206_Material_Infos].[OBID]) AND (([041206_Material_Infos].PARTNUMBER)=´test455545´));
Gruß
Ralf
setze um deine Tabellennamen im Where-Kriterium "[" und "]", oder nimm die Ziffernfolge "041206_" aus den Tabellenbezeichnungen und der Abfrage raus. Die Felder benutze ohne vorangestellten Tabellennamen. Bei meinem Test hat das geholfen.
SELECT MAT_OBID,OBID
FROM 041206_MatVersionen_Info, 041206_Material_Infos
WHERE ((([041206_MatVersionen_Info].MAT_OBID)=[041206_Material_Infos].[OBID]) AND (([041206_Material_Infos].PARTNUMBER)=´test455545´));
Gruß
Ralf
Antwort 15 von Sashka
Hallo Hinki27,
ich habe nun die Ziffernfolge und den Unterstrich rausgenommen und jetzt funktioniert es.... ;-)
Aber irgendwie ist es ja schon etwas komisch.....aber vielen dank, hauptsache es funktioniert jetzt..... ;-)
nochmals vielen dank!!!
Gruß
Sashka
ich habe nun die Ziffernfolge und den Unterstrich rausgenommen und jetzt funktioniert es.... ;-)
Aber irgendwie ist es ja schon etwas komisch.....aber vielen dank, hauptsache es funktioniert jetzt..... ;-)
nochmals vielen dank!!!
Gruß
Sashka
Antwort 16 von draack
Hi,
@Sashka: Wieso hast du eigentlich die Ziffern und den Unterstrich in die Abfrage mit aufgenommen? Die stehen doch nicht wirklich so in deiner MS Access DB?
Tschö,
Volker
@Sashka: Wieso hast du eigentlich die Ziffern und den Unterstrich in die Abfrage mit aufgenommen? Die stehen doch nicht wirklich so in deiner MS Access DB?
Tschö,
Volker
Antwort 17 von Sashka
doch, die stehen da so drin.....die ziffern stehen für das datum an dem die datenbank erstellt wurde.
Die habe ich aber nicht erstellt, sondern so übergeben bekommen...!
Aber jetzt stehen die da nicht mehr so drin ;-)
Sashka
Die habe ich aber nicht erstellt, sondern so übergeben bekommen...!
Aber jetzt stehen die da nicht mehr so drin ;-)
Sashka
Antwort 18 von draack
Hi,
dann ist das das Problem. Soweit ich mich erinner sieht der SQL-Standard einen Buchstaben als erstes Zeichen des Tabellennamens vor - da ist die ODBC-Schnittstelle also pingeliger als MS Access. Womit mal wieder bewiesen wäre, das MS Access kein "richtiges" RDBMS ist.
Tschö,
Volker
dann ist das das Problem. Soweit ich mich erinner sieht der SQL-Standard einen Buchstaben als erstes Zeichen des Tabellennamens vor - da ist die ODBC-Schnittstelle also pingeliger als MS Access. Womit mal wieder bewiesen wäre, das MS Access kein "richtiges" RDBMS ist.
Tschö,
Volker

