Delphi SQL beágyazott SELECT

Delphi SQL beágyazott SELECT
2012-02-02T15:48:38+01:00
2012-02-03T05:39:01+01:00
2022-11-24T13:50:40+01:00
Wfater
Az alap kérdés, hogy ha egy lekérdezésben max függvényt használok, hogyan lehet minden mezőt visszakapni. A témában minden bejegyzést végigolvastam. Megoldást is véltem találni, de a következő üzenetet kapom:

Invalid use keyword
Token: SELECT
Line Number: 5


A lekérdezés kódja:
SELECT KOD, UDATUM, .... FROM LEOLV INNER JOIN (SELECT KOD, MAX(UDATUM) AS UDATUML FROM LEOLV GROUP BY KOD) AS lekerdezes ON LEOLV.KOD = lekerdezes.KOD AND LEOLV.UDATUM = lekerdezes.UDATUML
Mutasd a teljes hozzászólást!
az ilyesmi beágyazott SELECT-et nem minden adatbáziskezelő támogatja. A BDE például valószínűleg nem. Milyen adatbázist használsz?

másképp kell....

Próbáld meg ezt:

SELECT l.* FROM leolv l LEFT JOIN leolv l2 on l2.kod = l.kod and l2.udatum > l.udatum WHERE l2.udatum is null
Mutasd a teljes hozzászólást!

  • Először is szeretném megköszönni, a megoldásod tökéletesen működik, természetesen a pont a tiéd.
    Ha még terhelhetlek vele, magyarázd el a működését.
    A kulcsszavak működésével tisztában vagyok, de ezeket az aliasokat (l, l2), vagy minek is nevezzem nem értem, még nem találkoztam ilyennel, vagy ilyen szintaktikával.
    Mutasd a teljes hozzászólást!
  • Ja egyébként dbase adatbázist használok. Amúgy eredetileg ez egy indexelt tábla. A lekérdezés a tábla fizikai sorrendjében adta vissza az adatokat, de azt már az ORDER BY záradékkal helyreállítottam :)
    Mutasd a teljes hozzászólást!
  • az alias különböző táblák esetén csak arra jó, hogy ne kelljen annyit gépelni, de ha ugyanazt a táblát JOIN-olod önmagával akkor nélkülözhetetlen, mert csak vele tudod megkülönböztetni egymástól a tábla két példányát.

    Kb. azt csinálja a lekérdezés, amit a tiéd, csak más eszközökkel. A maximum érték az, amelyiknél nincs nagyobb, vagyis ahol a LEFT JOIN nem talál értéket, vagyis a közös sorban nincs l2 rész (dátum is null), mert l-é a legnagyobb. Ennyi az egész.

    MAX-szal csinálni áttekinthetőbb, jobban látszik, mi történik, csak a bénább SQL értelmezők nem értik meg, ezért kellett a kis trükk.
    Mutasd a teljes hozzászólást!
  • Valószínűleg rosszul fogalmaztam. A működést megértettem, csak az aliasok ilyen szintaktikáját nem ismertem.
    Eddig úgy ismertem: "valami AS álnév".
    Ebben a példában ez "valami álnév" szintaktikának látszik.
    Eddig úgy tudtam, hogy előbb deklarálni kell az álnevet és utána lehet használni, ezzel szemben úgy tűnik a megoldásban először SELECT sorban már használod ("l") és később a From sorban deklarálod ("leolv l").

    A kérdés tehát igazából az alias ilyen módon való használatának szabályaira vonatkozna. Megköszönöm, ha erről még pár szót írnál.
    Mutasd a teljes hozzászólást!
  • 1./ Az alias dekraláció helye
    Közben találtam egy linket a lekérdezések végrehajtási sorrendjéről linkhttp://tudastar.netacademia.net/default.aspx?upid=17726
    A FROM hamarabb hajtódik végre, mint a SELECT, így már világos az "l" alias deklarációjának a helye.

    2./ Az alias deklaráció szintaktikája
    Kipróbáltam AS használatával a megoldásod:

    SELECT l.* FROM leolv AS l LEFT JOIN leolv AS l2 on l2.kod = l.kod and l2.udatum > l.udatum WHERE l2.udatum is null ORDER BY kod

    Működik :)

    Ebből arra következtettem, hogy "valami AS álnév" helyett használható a "valami álnév" szintaktika.

    Még egyszer köszönöm a segítséget.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd