Einfache SQL-Anweisung hat Syntax-Fehler?
Einfache SQL-Anweisung hat Syntax-Fehler?
am 12.07.2006 10:50:05 von maik.wiege
Hallo!
Ich habe eine meiner Meinung nach eigentlich einfache SQL-Anfrage, die
aber mein MySQL mit einem Syntaxfehler ablehnt. Meine Tabelle besteht
aus folgenden Feldern: [id] (INTEGER), [path] (VARCHAR). Nun möchte
ich die Datensätze bekommen, die in [path] den gleichen Wert haben,
den dort auch schon der Eintrag mit der id=3D1 besitzt.
Meine SQL-Anfrage lautet daher:
SELECT a1.id FROM articles AS a1 WHERE a1.path =3D
(SELECT a2.path FROM article AS a2 WHERE a2.id=3D1)
Diese wird allerdings von MySQL mit der Meldung: You have an error in
your SQL syntax. Check the manual that corresponds to your MySQL server
version for the right syntax to use near 'SELECT a2.pathFROM article AS
a2 WHERE a2.id=3D1)' at Line 2.
Woher kommt das? Die einzelnen SELECT-Abfragen funktionieren einzeln
genommen ja auch wunderbar!
Die MySQL-Version ist übrigen 4.0.18 (derzeit auf WinXP).
Vielen Dank für jegliche Hilfe
Maik
Re: Einfache SQL-Anweisung hat Syntax-Fehler?
am 12.07.2006 10:56:07 von Christian Kirsch
maik.wiege@googlemail.com schrieb:
> Hallo!
> Ich habe eine meiner Meinung nach eigentlich einfache SQL-Anfrage, die
> aber mein MySQL mit einem Syntaxfehler ablehnt. Meine Tabelle besteht
> aus folgenden Feldern: [id] (INTEGER), [path] (VARCHAR). Nun möchte
> ich die Datensätze bekommen, die in [path] den gleichen Wert haben,
> den dort auch schon der Eintrag mit der id=1 besitzt.
> Meine SQL-Anfrage lautet daher:
> SELECT a1.id FROM articles AS a1 WHERE a1.path =
> (SELECT a2.path FROM article AS a2 WHERE a2.id=1)
> Diese wird allerdings von MySQL mit der Meldung: You have an error in
> your SQL syntax. Check the manual that corresponds to your MySQL server
> version for the right syntax to use near 'SELECT a2.pathFROM article AS
> a2 WHERE a2.id=1)' at Line 2.
>
> Woher kommt das? Die einzelnen SELECT-Abfragen funktionieren einzeln
> genommen ja auch wunderbar!
> Die MySQL-Version ist übrigen 4.0.18 (derzeit auf WinXP).
>
*Hast* Du in der Dokumentation zu 4.0 nachgelesen, wie dort SELECTs
definiert sind?
Unter "Problematischer SQL, der eigentlich laufen müsste" findest Du
in dieser NG einen Thread, in dem es um exakt dasselbe Thema geht.
Re: Einfache SQL-Anweisung hat Syntax-Fehler?
am 12.07.2006 11:01:15 von Carsten Wiedmann
maik.wiege@googlemail.com schrieb:
> Meine SQL-Anfrage lautet daher:
> SELECT a1.id FROM articles AS a1 WHERE a1.path =
> (SELECT a2.path FROM article AS a2 WHERE a2.id=1)
> Diese wird allerdings von MySQL mit der Meldung: You have an error in
> your SQL syntax. Check the manual that corresponds to your MySQL server
> version for the right syntax to use near 'SELECT a2.pathFROM article AS
> a2 WHERE a2.id=1)' at Line 2.
>
> Die MySQL-Version ist übrigen 4.0.18 (derzeit auf WinXP).
Man lese ganz einfach die Doku [1].
Gruß
Carsten
[1] http://dev.mysql.com/doc/refman/4.1/en/subqueries.html
Re: Einfache SQL-Anweisung hat Syntax-Fehler?
am 12.07.2006 11:02:59 von unknown
Post removed (X-No-Archive: yes)
Re: Einfache SQL-Anweisung hat Syntax-Fehler?
am 12.07.2006 11:27:55 von maik.wiege
Carsten Wiedmann schrieb:
> Man lese ganz einfach die Doku [1].
> ...
> [1] http://dev.mysql.com/doc/refman/4.1/en/subqueries.html
Ja, und da steht als erstes Beispiel:
SELECT * FROM t1 WHERE column1 =3D (SELECT column1 FROM t2);
Ich sehe da nicht wirklich einen Unterscheid zu meiner Query.
Ulrich Gehauf schrieb:
> Du möchtest dich bitte grundlegend mit der JOIN-Syntax vertraut machen.=
..
Also mir ist schon klar, dass man das mit nem Kreuzprodukt, bzw. JOIN
lösen kann, aber das wäre doch in diesem Fall nicht wirklich
sinnvoll. Ein Zeit und Speicherintensives JOIN oder wie hier wobei der
Optimierer die Subquery nur ein mal auswerten braucht und dann den Wert
einfach mit nur einen Scan mit den Werten der Tabelle vergleichen muss.
Habe nun noch herausgefudnen, dass wenn ich einen Strichpunkt vor die
letzte Klamemr setze, kein Syntax-Error mehr kommt, allerdings ist dann
das Ergebnis der Sub-Query immer leer, was wohl an den Klammern liegt,
die ja aber gebraucht werden.
Ein Test ergab nämlich, dass bei Eingabe nur von
SELECT a2.path FROM article AS a2 WHERE a2.id=3D1
der korrekten Wert geliefert wird, mit
(SELECT a2.path FROM article AS a2 WHERE a2.id=3D1)
allerdings ein leeres Ergebnis erscheint.
Bin echt etwas verwirrt, habe nämlich ähnliche Anfragen schon öfter
und ohne Probleme gemacht. Übersehe doch sicherlich irgendwas ganz
einfaches hier, oder?
Re: Einfache SQL-Anweisung hat Syntax-Fehler?
am 12.07.2006 11:33:57 von sylvio runge
maik.wiege@googlemail.com wrote:
>
> Carsten Wiedmann schrieb:
>
> > Man lese ganz einfach die Doku [1].
> > ...
> > [1] http://dev.mysql.com/doc/refman/4.1/en/subqueries.html
> Ja, und da steht als erstes Beispiel:
> SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
>
> Ich sehe da nicht wirklich einen Unterscheid zu meiner Query.
>
Subquerys gehen erst *ab 4.1*. Steht auch gross im Manual...
S.
Re: Einfache SQL-Anweisung hat Syntax-Fehler?
am 12.07.2006 11:35:45 von Fabian Schladitz
maik.wiege@googlemail.com schrieb:
> Carsten Wiedmann schrieb:
>=20
>=20
>>Man lese ganz einfach die Doku [1].
>>...
>>[1] http://dev.mysql.com/doc/refman/4.1/en/subqueries.html
>=20
> Ja, und da steht als erstes Beispiel:
> SELECT * FROM t1 WHERE column1 =3D (SELECT column1 FROM t2);
Dann mache ich halt den Vorlesedienst...
"Starting with MySQL 4.1, all subquery forms and operations that the SQL =
standard requires are supported, as well as a few features that are=20
MySQL-specific."
Starting with 4.1 heißt, dass 4.0.18 (deine Version) _keine_ Subqueries=
=20
unterstützt.
Lesen bildet.
--=20
Gähn,
Fabian
Re: Einfache SQL-Anweisung hat Syntax-Fehler?
am 12.07.2006 11:40:08 von Axel Schwenke
maik.wiege@googlemail.com wrote:
> Carsten Wiedmann schrieb:
>
>> Man lese ganz einfach die Doku [1].
>> ...
>> [1] http://dev.mysql.com/doc/refman/4.1/en/subqueries.html
> Ja, und da steht als erstes Beispiel:
Nein. Da steht als erstes (na gut, im zweiten Satz)
"Starting with MySQL 4.1, all subquery forms and operations that the
SQL standard requires are supported"
Fällt dir was auf?
> Ulrich Gehauf schrieb:
>> Du möchtest dich bitte grundlegend mit der JOIN-Syntax vertraut machen.
> Also mir ist schon klar, dass man das mit nem Kreuzprodukt, bzw. JOIN
> lösen kann, aber das wäre doch in diesem Fall nicht wirklich
> sinnvoll. Ein Zeit und Speicherintensives JOIN oder wie hier wobei der
> Optimierer die Subquery nur ein mal auswerten braucht und dann den Wert
> einfach mit nur einen Scan mit den Werten der Tabelle vergleichen muss.
Wie kommst du darauf? Wenn ein JOIN zu einer Subquery äquivalent ist,
dann ist auch der Aufwand gleich. Ein ideales DBMS würde für beide
Statements den exakt gleichen Ausführungsplan generieren. MySQL ist
bei weitem noch nicht perfekt :-) mehr noch - Subqueries sind ein
vergleichsweise neues Featuren in MySQL. Das führt dazu, daß der
Optimizer für JOIN meist einen besseren Plan findet aus für eine
äquivalente Subquery.
XL
Re: Einfache SQL-Anweisung hat Syntax-Fehler?
am 12.07.2006 11:46:06 von Christian Kirsch
maik.wiege@googlemail.com schrieb:
> Carsten Wiedmann schrieb:
>
>> Man lese ganz einfach die Doku [1].
>> ...
>> [1] http://dev.mysql.com/doc/refman/4.1/en/subqueries.html
> Ja, und da steht als erstes Beispiel:
> SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
>
> Ich sehe da nicht wirklich einen Unterscheid zu meiner Query.
>
Gibt's auch nicht. Aber: Du benutzt nicht 4.1.
Übrigens wäre es nett, wenn Du http://learn.to/quote lesen und
beherzigen würdest.