mysql-Query-Frage
Jörg
- mysql
- sql
Hallo,
kann mir einer erklären, warum folgende Query das gewünschte Ergebnis bringt, während die Änderung auf ein Alias die Fehlermeldung "#1054 - Unbekanntes Tabellenfeld 'myMID' in where clause
" bringt?
Läuft:
SELECT
rz.RID,
rz.MID
FROM
table1 rz JOIN table2 r ON rz.RID = r.RID
WHERE
r.Bart = 'R' AND
r.Rart = 'A' AND
r.Erstelldatum > (
SELECT
r2.Erstelldatum
FROM
table2 r2 JOIN table1 rz2 ON rz2.RID = r2.RID
WHERE rz2.MID = rz.MID AND
r2.Bart = 'R' AND
r2.Rart = 'R' AND
r2.St = 0 AND
r2.D = 1
)
Bringt Fehler:
SELECT
rz.RID,
rz.MID AS myMID
FROM
table1 rz JOIN table2 r ON rz.RID = r.RID
WHERE
r.Bart = 'R' AND
r.Rart = 'A' AND
r.Erstelldatum > (
SELECT
r2.Erstelldatum
FROM
table2 r2 JOIN table1 rz2 ON rz2.RID = r2.RID
WHERE rz2.MID = myMID AND
r2.Bart = 'R' AND
r2.Rart = 'R' AND
r2.St = 0 AND
r2.D = 1
)
Jörg
Hallo,
kann mir einer erklären, warum folgende Query das gewünschte Ergebnis bringt, während die Änderung auf ein Alias die Fehlermeldung "
#1054 - Unbekanntes Tabellenfeld 'myMID' in where clause
" bringt?
siehe problems with aliases.
Aliasse in Whereklauseln sind offenbar nicht erlaubt.
Gruß
Kalk
Hallo Jörg,
zur Ergänzung dessen, was Tabellenkalk sagte: der SELECT steht zwar vorn im SQL Statement, aber man muss das so deuten:
SELECT dies-und-das FROM jenem-und-welchem
Damit dies-und-das selektiert werden kann, muss jenes-und-welches zunächst bestimmt werden. Und weil das Selektieren nach dieser Bestimmung stattfindet, kann während der Bestimmung nichts verwendet werden, was beim Selektieren erst festgelegt wird.
Rolf
Moin Jörg,
in Ergänzung zu Tabellenkalk und Rolf sei noch gesagt, dass dein Anliegen eventuell „umgekehrt“ funktioniert (ungetestet), also den Alias eines Sub-SELECT im äußeren SELECT zu verwenden.
Viele Grüße
Robert
Hallo Robert,
ich glaube, einem Subselect in einer WHERE-Expression, also so wie hier:
WHERE ...
AND r.Erstelldatum > (SELECT r2.Erstelldatum
FROM table2 r2 JOIN table1 rz2 ON rz2.RID = r2.RID
WHERE rz2.MID = myMID AND
r2.Bart = 'R' AND r2.Rart = 'R' AND
r2.St = 0 AND r2.D = 1)
kann man keinen Alias zuweisen.
Und man kann ihn auch nicht als SUBSELECT in die SELECT-Liste klemmen, ihm dort einen Alias geben und dann im WHERE darauf Bezug nehmen.
Da der Subselect auf eine Spalte aus dem Hauptselect Bezug nimmt, glaube ich auch nicht, dass man den Subselect sinnvoll loswerden kann. Oder? Hm.
SELECT rz.RID, rz.MID
FROM table1 rz
JOIN table2 r ON r.RID = rz.RID AND r.BArt = 'R'
JOIN table1 rz2 ON rz2.MID = rz.MID
JOIN table2 r2 ON r2.RID = rz2.RID AND r2.BArt = 'R'
WHERE r.RArt = 'A'
AND r2.RArt = 'R'
AND r2.St = 0
AND r2.D = 1
AND r.Erstelldatum > r2.Erstelldatum
Ob das lesbarer ist... Muss Jörgbeurteilen. Und man müsste es auch noch EXPLAINen, um zu schauen, ob es gleich effizient ist.
Rolf
Hallo an alle,
vielen dank für Eure Antworten, ich wußte nicht, dass quasi die innere Query zuerst aufgelöst wird.
So ist natürlich zu verstehen, dass das Alias nicht erkannt wird.
Ob das lesbarer ist... Muss Jörgbeurteilen. Und man müsste es auch noch EXPLAINen, um zu schauen, ob es gleich effizient ist.
Eher nicht.
Ich kann auch ohne das Alias leben, wollte nur den hintergrund für den Fehler wissen.
Danke nochmal an Euch,
Jörg
Moin Rolf,
ich glaube, einem Subselect in einer WHERE-Expression, also so wie hier:
WHERE ... AND r.Erstelldatum > (SELECT r2.Erstelldatum FROM table2 r2 JOIN table1 rz2 ON rz2.RID = r2.RID WHERE rz2.MID = myMID AND r2.Bart = 'R' AND r2.Rart = 'R' AND r2.St = 0 AND r2.D = 1)
kann man keinen Alias zuweisen.
ich dachte an so etwas wie
WHERE ...
AND r.Erstelldatum > (
SELECT r2.Erstelldatum AS Datum FROM ...
)
Viele Grüße
Robert
Hallo Robert B.,
ich dachte an so etwas wie
WHERE ...
AND r.Erstelldatum > (
SELECT r2.Erstelldatum AS Datum FROM ...
)
Auf den Alias in diesem konkreten Kontext kannst Du außerhalb der Klammer nicht zugreifen. Er nützt auch nichts, weil das ja ein Subselect ist, der als Operand in einer Bedingung verwendet wird, d.h. diese Query darf eh nur genau einen Wert zurückgegeben, der namenlos verwendet wird.
Rolf