Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

ist es möglich im where ausdruck auf temporäre datenfelder zu verwenden

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von mathiasb, 23 September 2013.

  1. mathiasb

    mathiasb Neuer Benutzer

    Hallo!
    Das ist mein Vorhaben:

    SELECT lokal_name, ((laengengrad - 48.2585139)*71.5)*((laengengrad - 48.2585139)*71.5) AS laengendiff, ((breitengrad - 16.4633033)*111.3)*((breitengrad - 16.4633033)*111.3) AS breitendiff FROM `user_lokale_liste_test1` WHERE SQRT(@laengendiff*@breitendiff) < 15

    Leider kommt kein Ergebnis zustande. Ist die Abfrage so möglich?
    Bzw dürfte der Ausdruck SQRT(@laengendiff*@breitendiff) nur NULL ergeben. Hat jemand eine Idee? Oder bin ich da überhaupt falsch unterwegs?

    Danke!
     
    Zuletzt bearbeitet: 23 September 2013
  2. akretschmer

    akretschmer Datenbank-Guru


    Da du fragst, hast es sicher schon erfolgreich im sinne vom erfolglos probiert und kennst somit die Antwort.

    Es wird zuerst die WHERE-Condition ausgeführt. Zu diesem Zeitpunkt ist Deine Berechnung mit dem Alias aber noch nicht ausgeführt. Soweit verstanden?

    PS.: Deine Abfrage wird bei größeren Datenmengen lahm sein. MySQL kennt weder funktionale Indexe noch materialized Views. Das nur am Rande.
     
  3. mathiasb

    mathiasb Neuer Benutzer

    Wow! Danke für die schnelle Antwort. Hatte eine ähnliche Abfrage im Netz gefunden und war wohl zu euphorisch.

    Könnte ich hier eine temporäre Tabelle erstellen und dann dort die Ergebnisse sortieren?
     
  4. akretschmer

    akretschmer Datenbank-Guru


    Zum nachmalen:

    Code:
    test=# create table mathias (i int, val int);
    CREATE TABLE
    Time: 1,155 ms
    test=*# insert into mathias values (1,1);
    INSERT 0 1
    Time: 0,325 ms
    test=*# select i, val + 1 as new_val from mathias where new_val = 2;
    ERROR:  column "new_val" does not exist
    LINE 1: select i, val + 1 as new_val from mathias where new_val = 2;
      ^
    Time: 0,224 ms
    test=*# select * from (select i, val + 1 as new_val from mathias ) bla where new_val = 2;
     i | new_val
    ---+---------
     1 |  2
    (1 row)
    
    
     
  5. akretschmer

    akretschmer Datenbank-Guru


    Mit einer materialized View würde es z.B. so gehen:

    Code:
    test=*# create materialized view matview_mathias as select i, val, val + 1 as new_val from mathias ;
    SELECT 1
    Time: 5,574 ms
    test=*# select * from matview_mathias where new_val = 2;
     i | val | new_val
    ---+-----+---------
     1 |  1 |  2
    (1 row)
    
    Fragt man das immer ab, kann man einen Index definieren:

    Code:
    test=*# create index idx_new_val on matview_mathias (new_val);
    CREATE INDEX
    Time: 5,150 ms
    test=*#
    
    Vorteil eines mat. Views: die Berechnung wird nicht jedes mal neu ausgeführt. Und der View ist, anders als eine temp. Tabelle, persistent. Via Statement-TRIGGER on insert / update / delete könnte man den View aktuell halten, oder via CRON einmal täglich, oder oder oder ...
     
  6. mathiasb

    mathiasb Neuer Benutzer

    Danke! Werde es gleich so umsetzen.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Da bin ich ja gespannt. MySQL kann keine materialized Views. Die andere Lösung wäre ein funktionale Index:

    Code:
    test=*# create index idx1 on mathias ((val + 1));
    CREATE INDEX
    Time: 3,683 ms
    test=*# set enable_seqscan=off;
    SET
    Time: 0,063 ms
    test=*# explain select * from mathias where (val+1) = 2;
      QUERY PLAN
    --------------------------------------------------------------------
     Index Scan using idx1 on mathias  (cost=0.13..8.14 rows=1 width=8)
      Index Cond: ((val + 1) = 2)
    (2 rows)
    
    Kann MySQL aber auch nicht.
     
  8. ukulele

    ukulele Datenbank-Guru

    Natürlich kann man die Berechnung auch in der WHERE Klausel ausführen nur schön ist das eben nicht. Man kann sich eben nicht mit einem Alias auf den Select beziehen sondern muss die Berechnung vollständig aufnehmen.

    Im Übrigen kannst du mit @laengendiff nicht auf laengendiff verweisen. In MS SQL nutzt man @ für deklarierte Variablen. Auch wenn das in MySQL nicht zwingend notwendig ist verwirrt das schon wenn @ in Spaltennamen verwendet wird.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden