Jörg: mysql-Query-Frage

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

  1. 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

  2. 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

    --
    sumpsi - posui - obstruxi
  3. 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

    1. 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

      --
      sumpsi - posui - obstruxi
      1. 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

      2. 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

        1. 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

          --
          sumpsi - posui - obstruxi