ugrás a tartalomhoz

Nem látható ALIAS létrehozása

world-s · 2008. Május. 22. (Cs), 16.08
Sziasztok!

Szükségem lenne valami ilyesmire:

SELECT ID, Name, (ID -1) AS id2 from tabla1 WHERE id2 >1

Azt tudom, hogy ezt így nem lehet megcsinálni, mert mező ALIAS nem lehet a WHERE-ben.

Ezért egy kiskaput használok:

SELECT ID, Name, (ID -1) AS id2 from tabla1 HAVING id2 >1

Bár nem tudom, hogy ez lassít, vagy sem a lekérdezésen.
(természetesen az (ID -1) egy bonyolultabb kifejezés és egy joint-ból következik, ezért nem tudok hivatkozni rá csak így. Most nem részletezném miért…)

A problémám viszont az ezzel, hogy ennek a SELECT-nek az eredményét egy másik SELECT-ben szeretném felhasználni.
SELECT * from tabla2 where id in(SELECT ID, Name, (ID -1) AS id2 from tabla1 HAVING id2 >1)

Viszont itt szerepelnek azok az ALIAS-ok amik itt már nem kellenének.

Hogy lehet ezt kiküszöbölni?
Üdv:
Zoli
 
1

Sorold fel az oszlopokat

zila · 2008. Május. 22. (Cs), 16.40
Gondolom nem joint-ból következik, hanem join-ból... A joint az más, bár abból is szoktak érdekes dolgok következni ;-)
Na. A megoldás egyszerű, sorold fel a külső select-ben azokat az oszlopokat amiket le akarsz kérdezni és kész.
SELECT col1, col1 FROM (SELECT col1, col2, (col3+col4) AS col5 FROM table HAVING col5 < 123)
2

Válasz

world-s · 2008. Május. 22. (Cs), 22.19
Szia.
A külső select-be tudom, hogy azt írjam be amit szeretnék, viszont ha jól tudom a "ID IN ()" miatt a belső select-nek csak egy oszlopos kimenete lehet alapban, hogy tudja, hogy melyik mezőt szeretném felsorolásként használni.

Tehát vagy el kellene ezért a belső select felesleges alias-ait rejteni, vagy hogy lehet ilyenkor megoldani, hogy az "ID" a hasznos adat és nem a "Name" vagy az "id2".

Üdv:
Zoli
3

Félreértettem

zila · 2008. Május. 23. (P), 10.00
Elnézést, félreértettem a problémát. Így próbálnám:
SELECT * FROM tabla2 WHERE id IN (SELECT id FROM (SELECT id, name, (id -1) AS id2 FROM tabla1 HAVING id2 >1))
De a name ha jól látom sehol nem kell, így:
SELECT * FROM tabla2 WHERE id IN (SELECT id FROM (SELECT id, (id -1) AS id2 FROM tabla1 HAVING id2 >1))
4

Köszi

world-s · 2008. Május. 23. (P), 10.14
Köszi a választ.
Ki fogom próbálni.

Arról van esetleg információd, hogy azzal, hogy HAVING-et használok mennyivel lesz lassabb a kérés?
Azért kérdem, mert ugye azt írják, hogy WHERE azért nem használható, mert akkor még nem jönnek létre a mezők mikor szűr.
Nekem pedig a táblám nagyon nagy lenne.

Üdv:
Zoli
5

Mérni kell

zila · 2008. Május. 23. (P), 11.15
Hát itt ugye a subselect-ek is kihatnak a performaciára, a számolt mező kiértékelése is lassít... Nem tudom, hogy a mysql hogyan áll jelenleg explain plan fronton, mennyire használható adatokat közöl, mindenesetre nézegetni kell a query explain plan-jét, bár ebben az lekérdezésben nehezen tudsz indexeket használni, nincs funkcionális index mysql-ben. Ha nagyon lassú lesz a lekérdezés eredménye, akkor érdemes lehet egy temp táblába kiválogatni a rekordokat, having nélkül és temp táblából már lehet where-rel szűrni, indexeket csinálhatsz az oszlopokra stb.