Access al-lekérdezés illesztése

Access al-lekérdezés illesztése
2015-04-17T11:38:19+02:00
2015-04-17T17:22:56+02:00
2022-10-15T23:20:19+02:00
bogár
Sziasztok!

Van egy sok táblás lekérdezésem Accessben (sok sima és egy Sum mező eredménnyel), és abba ágyazva egy al-lekérdezés, a külső Sum táblájával azonos táblában lévő, másik 4 db Sum mezővel és egy ID mezővel (ezek a belső Sum-ok is a külső select eredménymezői közé vannak írva). A belső lekérdezés ugyanozokat a táblákat használja, de kívül x, belül 4-szer különféle y aliasokkal megkülönböztetve.

select ..,..,.. from T1x,T2x, T3x, ( select ..,..,.. from T1y, T2y, T3y where ... ) where T3x.ID=T3y.ID
Van közöttük a T3.ID mező, amivel illesztettem őket a külső select WHERE-ben. (Próbáltam a belsőben is összekötni, meg egyszerre kint-bent, de úgy se jó, akkor futtatásnál az Access bekéri a T3x.ID értékét.) Mindkét lekérdezés külön-külön futtatva lefut kb. 5 illetve 10 mp alatt (a külsőben 3000 sor jön le, a belsőben 284.000, ebből kellene a külső select 3000 sorához való belső 3000 sor), de amikor a fenti módon egybe ágyazom őket, "Túlcsordulás" üzenet jön. Kevés lehet ez a fajta összekötés ilyen esetben? Vagy máshogy kell elrendezni a két selectet?

Ha a külsőnél és a belsőnél is egy konkrét T3.ID adatot adok meg, akkor viszont lefut jól: 12 mp alatt jön le az egyetlen sor eredmény (ami soknak tűnik a felső mp adatok fényében).

Mi lehet a baj? Nagyon köszönöm a segítséget!
Mutasd a teljes hozzászólást!
Huh, nem azzal lesz a gond, hanem a

CInt(Left([u].[UGYFEL_ID],8)

kifejezéssel. 8 számjegy picit sok lesz az integer-nek. Cseréld le a cint-et clng-re. Tehát integer helyett long típust fogsz használni.

Viszont egy másik témában meg lehetne vitatni az egész lekérdezés struktúráját, mert lehet, hogy egyszerűbben is meg lehet oldani, ha többet leírsz az adatokról és hogy pontosan mi is lenne az elvárt eredmény!
Mutasd a teljes hozzászólást!

  • 1. Kicsit zavaros a leírásod, nem lehetne egy teljes konkrét példát írni?
    2. Access jobban kezeli teljesítmény szempontjából, ha nem egy lekérdezésbe tuszkolod be így az allekérdezéseket, hanem az allekérdezéseket elkészíted önálló lekérdezésekként és a fő lekérdezésben ezeket kötöd össze és nem közvetlenül a táblákat.
    3. Az allekérdezésben lévő táblához nem férsz hozzá a külső lekérdezésben. A külső lekérdezés csak a belső eredményét látja, azt nem, hogy az miként jött létre. Az allekérdezést el kell látnod egy alias-szal: ... from (select ... ) as t

    A külső lekérdezésben a kapcsolást pedig T3x.ID=t.ID módon kell végrehajtanod. Ha a belső lekérdezésben több táblának is van ID tulajdonsága és azokat is vissza kell adnia a belső lekérdezésnek, akkor a mezőket is alias-szal kell ellátnod, hogy egyediek legyenek. Pl. select id as T3yID from T3y

    Ha egy allekérdezésben csinálod ezt, akkor a külső lekérdezésben az allekérdezés_alias.mező_alias formában érheted el, azaz fenti példákkal élve, t.T3yID formában hivatkozhatsz rá.

    De ha a 2. pontban leírt tanácsot megfogadod, akkor ott eleve az access segíteni fog ezeknek a kialakításában és a fenti bonyolultabb sql struktúra is összekattintgatható lesz.
    Mutasd a teljes hozzászólást!
  • Azért lenne szerencsésebb 1 lekérdezésben megoldani, mert így is a lenti SQL 22x van egymás alatt ismételve (kül. egységekre igazítva) és UNION ALL-al összekötve, így az egész 1 db gigalekérdezés (ami működik, csak kellene bele egységenként a FELÁR is).

    "az allekérdezéseket elkészíted önálló lekérdezésekként és a fő lekérdezésben ezeket kötöd össze és nem közvetlenül a táblákat"
    Ha mégis e szerint szedném szét (44 lekérdezésbe), akkor ezek kimenet mezőit át kellene alakítani, aliasonli? És azután készítek egy üres lekérdezést, amibe belehuzigálom ezt a 44-et? Majd ennél a pontnál fogalmam sincs, mit mivel és hogyan kellene összekötni. :S Elnézést kérek a dilettantizmusom miatt, nagyon kezdő vagyok, a saját munkám megkönnyítéséhez kellene ez a lekérdezés (napi 2 óra vs. 5 perc).

    Ez lenne a (leegyszerűsített) konkrét példa:

    SELECT Year([NAP]) AS ÉV, Sum(mart.SZAMLAZOTT) AS SZAMLAZOTT, megr.MEGNEVEZES AS LEÍRÁS, megt.MERETKOD, megt.KOD, BB.FELÁR FROM ( SELECT mart1.BARKOD AS BAR1, Sum(mart1.OSSZEG) AS FELÁR FROM BOBMART AS mart1 INNER JOIN MODEM AS armo1 ON mart1.ARKOD = armo1.KOD WHERE armo1.FAJTA="FA" GROUP BY mart1.BARKOD ) AS BB, PCR_UGYFEL AS u, PCR_UGYFEL AS u1, PCR_UGYFEL AS u2, ((((BOBMART AS mart INNER JOIN (BOBMTET AS megt INNER JOIN BOBMEGR AS megr ON megt.RENDELKOD = megr.KOD) ON mart.BARKOD = megt.KOD) INNER JOIN (BOBCRM_TERMEK AS termk INNER JOIN PCR_TERMEK AS term ON termk.TERMEK_ID = term.TERMEK_ID) ON megt.LAPKOD = termk.KOD) INNER JOIN KEZEL AS k ON megr.FELVEVO = k.KOD) INNER JOIN BR1_HIRDTIP AS htip ON megt.HIRDTIP = htip.KOD) INNER JOIN BR1_ARKAT AS arkat ON megt.ARKAT = arkat.KOD WHERE (((CInt(Left([u].[UGYFEL_ID],8)))=[megr].[MEGRELO]) AND ((CInt(Left([u1].[UGYFEL_ID],8)))=[megr].[EGYSEG]) AND ((CInt(Left([u2].[UGYFEL_ID],8)))=[megr].[AGENT])) AND BB.BAR1 = mart.BARKOD GROUP BY Year([NAP]), megr.MEGNEVEZES, megt.MERETKOD, megt.KOD, BB.FELÁR HAVING (((Year([NAP]))=2015));
    A BB.BAR1 = mart.BARKOD kötné össze a külsőt a belsővel, de erre "Túlcsordulás"-t ír az Access. Külön-külön jól lefutnak. Így próbáltam összekötni, de alighanem rosszul csinálom.
    Nagyon köszönöm a segítséget!
    Mutasd a teljes hozzászólást!
  • A túlcsordulást szerintem a
    Sum(mart.SZAMLAZOTT)
    kifejezés miatt kapod. Próbáld ki csak a teszt kedvéért sum helyett min-t írni a lekérdezésbe. Ha így működik, akkor vagy eleve megváltoztatod a szamlazott mező típusát, hogy nagyobb számokat is be tudjon fogadni. Mi a mező mérete a szamlazott mezőnél?

    Továbbá szvsz a
    Year([NAP]))=2015
    feltételt ha having-ből át lehetne mozgatni a where-be és máris kicsit gyorsabb lenne a dolog.
    Mutasd a teljes hozzászólást!
  • A Mezőméret=Dupla (de csak olvasási jogom van a DB-re).
    Átírtam a Sum-okat kívül-belül Min-re, sőt, összegzés nélkül is próbáltam futtatni: túlcsordulást ír így is. A Havingból Where-be tettem az időt, ez sem segített a futáson.
    Mutasd a teljes hozzászólást!
  • Huh, nem azzal lesz a gond, hanem a

    CInt(Left([u].[UGYFEL_ID],8)

    kifejezéssel. 8 számjegy picit sok lesz az integer-nek. Cseréld le a cint-et clng-re. Tehát integer helyett long típust fogsz használni.

    Viszont egy másik témában meg lehetne vitatni az egész lekérdezés struktúráját, mert lehet, hogy egyszerűbben is meg lehet oldani, ha többet leírsz az adatokról és hogy pontosan mi is lenne az elvárt eredmény!
    Mutasd a teljes hozzászólást!
  • Kedves Árnyék!

    Nem tudom, hogyan köszönhetném meg Neked! Immár sokadszor! Szóval: MŰKÖDIK!!!

    Átírtam a CLng-re a CInt függvényeket, és bár egy perc alatt, de lefutott, úgy, hogy másba még nem is piszkáltam bele!

    A 8-asból 7-et tudok csinálni (lejjebb már nem vehetem, különben hibásan működne), és a Having-ból Where-be tettem az évszámot - bár nem vettem észre változást stopperrel mérve.

    Most jön a következő lépés, hogy elindítom az összefűzött 22 lekérdezést, leoltom a villanyt, hazamegyek, és hétfőn megnézem, fut-e még, vagy addigra az Oracle szerver rég leolvadt a pincében.

    Ha szabad, később szívesen kérdeznék majd egy új témában a struktúráról, igyekszem leegyszerűsíteni a példa SQL-t. Biztosan lehetne optimalizálni, mert a célszoftverben a hasonló listák pikkpakk elkészülnek. Persze, azt hozzáértő emberek készítették.

    Még egyszer nagyon köszönöm a segítségedet! Életet mentettél...
    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