Johnny B.: Problem mit alias im Subselect

Hallo geehrtes Forum,

ich habe folgenden mySQL-Query:

SELECT start, ende, summe,  
       (SELECT COUNT(*) FROM statistik WHERE datum >= start AND datum <= ende) AS ergebnis,  
       ( summe / ergebnis ) AS kosten  
FROM tabelle

Die Fehlermeldung sagt, 'ergebnis' ist in 'tabelle' nicht vorhanden. Ich dachte, SQL würde sich 'ergebnis' durch die Zuweisung mit AS merken und könnte dann auch damit rechnen?

Die Alternative wäre eine doppeltes Subselect, aber das ist ja auch Quatsch:

SELECT start, ende, summe,  
       (SELECT COUNT(*) FROM statistik WHERE datum >= start AND datum <= ende) AS ergebnis,  
       ( summe / (SELECT COUNT(*) FROM statistik WHERE datum >= start AND datum <= ende) ) AS kosten  
FROM tabelle

Wie mache ich das denn hier am besten und richtig?

Besten Gruß
JOhnnY

  1. moin,

    Ich dachte, SQL würde sich 'ergebnis' durch die Zuweisung mit AS merken und könnte dann auch damit rechnen?

    nicht an dieser stelle und in dieser form. und noch als zusatz, das AS kannst du weglassen.

    Die Alternative wäre eine doppeltes Subselect, aber das ist ja auch Quatsch

    quatsch würde ich grundsätzlilch nicht sagen, das ist durchaus ein gehbarer weg. oder aber du benutzt die abfrage als unterabfrage in der FROM klausel, dann kannst du auch den alias namen verwenden.

    SELECT t.start, t.ende, t.summe, t.ergebnis, t.summe/t.ergebnis kosten
    FROM (
         SELECT start, ende, summe,
                (SELECT COUNT(*)
                 FROM statistik
                 WHERE datum >= start
                 AND datum <= ende
                ) ergebnis
         FROM tabelle
        ) t
    ;

    Ilja

    1. Hallo Ilja,

      quatsch würde ich grundsätzlilch nicht sagen, das ist durchaus ein gehbarer weg.

      Ja, den Weg kann man gehen, also funktionieren tut es. Aber ist es nicht doch irgendwie Quatsch, bzw. brutal suboptimal, für einen einzigen Wert zwei (oder in meinem _richtigen_ Fall sogar drei) Datenbankabfragen zu machen?

      oder aber du benutzt die abfrage als unterabfrage in der FROM klausel, dann kannst du auch den alias namen verwenden.

      Prima, danke Dir! Sieht interessant aus. Verstehe ich das richtig, daß hier nur im inneren und innersten Teil eine DB-Abfrage passiert? Der dritte SELECT außen ist dann nur noch so etwas wie eine schnelle Zusammenfassung, die kaum Performance benötigt, oder braucht die dreifache Verschachtelung von SELECTs doch recht viel Rechenzeit? (Kann ich mir zwar eigentlich nicht vorstellen, aber ich habe keinen Plan, wie so eine DB 'tickt').

      Besten Gruß
      JOhnnY

      1. moin,

        Verstehe ich das richtig, daß hier nur im inneren und innersten Teil eine DB-Abfrage passiert? Der dritte SELECT außen ist dann nur noch so etwas wie eine schnelle Zusammenfassung, die kaum Performance benötigt, oder braucht die dreifache Verschachtelung von SELECTs doch recht viel Rechenzeit? (Kann ich mir zwar eigentlich nicht vorstellen, aber ich habe keinen Plan, wie so eine DB 'tickt').

        grundsätzlich solltest du deine datenbank befragen, wie der ausführungsplan aussieht. das kann je nach dbms und version, vorhandene indizies, containts, dateninhalte, etc sehr anders aussehen, sprich die faktoren für einen ausführungsplan sind manigfaltig. du machst einen denkfehler, das dbms führt die abfrage nicht immer so aus, wie du sie schreibst. sprich selbst in der ersten scheibweise deiner abfrage, kann es sein, dass die unterabfrage nur einmal ausgeführt wird, obwohl sie zweimal dort steht. dbms merken sich unter anderen unterabfragen vom egebnis her, wenn sie nicht korrelieren, sprich wennn das ergebnis unabhängig ist. also wenn du auf der sicheren seite sein willst, dann schaue dir immer den ausführungsplan aus und der kann sich im laufe der zeit auch mal verändern.....

        Ilja