Sziasztok!
Egy PL/pgSQL függvényt próbálok írni, de eddig sajnos kevés sikerrel.
Az eredeti táblák több mezőt tartalmaznak, a problémát egyszerűsítve fogalmazom meg.
Adottak a T1, T2 és T3 táblák, melyek sémája különböző. Valamint van egy T tábla, melyben a Tn (n=1,2,3) táblák rekordjainak egy sorozata van tárolva (nem minden rekord szerepel benne, egy rekord többször is előfordulhat).
A T sémája:
id (primary key)
t (melyik Tn táblában van a rekord)
t_id (a rekord Tn táblabeli azonosítója)
elozo (az előző rekord T.id-je a sorozatban, első rekordnál 0)
Ebből szeretném lekérdezni a Tn táblabeli rekordokat a T táblában meghatározott sorrendben.
PL/pgSQL nélkül csak több query küldésével tudtam megoldani, ami nem szép:
1. lekérdezem a T-ből azt a rekordot, melyre az elozo=0
2. T.t táblából T.t_id-jű rekord lekérdezése (elágazás)
3. elozo=T.elozo; goto 1
Vége ha az 1. pontban szereplő lekérdezés eredménye üres.
Ezt szeretném egy PL/pgSQL függvénnyel helyettesíteni.
Cursor használatával próbáltam megoldani de nem sikerült.
Van javaslatotok arra, hogy a fenti táblaszerkezettel hogyan lehet ezt a lekérdezést szépen és hatékonyan megírni?
Előre is köszönöm a válaszokat!
- 1421 megtekintés
Hozzászólások
hali
hat nem tudom, de rohadt mocsoknak tunik a szerkezete.
ha jol ertem, van 4 db tablad.
az egyik egy vezerlo vagy torzs tabla, vagy index-tabla, mert mintha azt a feladatot latna el.
a maradek harom tabla harom sima tabla annyi megkotessel, hogy egy azon primary key-t hasznaljak olyan megkotessel, hogy egy kulcs csak az egyik tablaban lehet, es magaban a tablaban nem lathato a vezerlo kulcsa, csak a sajat kulcsa, (ami nem pk)
a tablak az egyszeruseg miatt T a vezerlo tabla, es annak a harom tablaja A,B,C
es azt szeretned, hogy legyen egy fv-ed, amit ha meghivsz mondjuk
fv(1) -el, akkor adja ki neked a azt a tablat amiben a T tablaban az 1-es kulcshoz tartozo (A|B|C) tabla adott rekordjat mutassa meg.
nem lesz egyszeru. en meg ilyet nem csinaltam, es nem tudom lehet-e olyat csinalni, hogy egy fv-nek tobb tipusu kimenete legyen. szerintem nem.
egy bonyolult megoldast tudok, ha az jo.
kell csinalnod egy tipust, ABC_tip pl, ami az A, B, es C tablak tipusait tartalmazza. ez lehet egy view fele omlesztes, vagy row_tipusok is.
es a fv-en belul pedig eldontod, hogy melyik row_tipusnak adsz visszateresi erteket, a tobbit pedig null-ra allithatod.
A (id serial,nev text)
B (id serial,tipus int4)
C (id serial,datum timestamp)
//tudom, hogy ez hulyeseg, mert lehet 1ben is, de e csak pelda
CREATE TYPE tipusA (id int4, nev text)
CREATE TYPE tipusB ...
CREATE TYPE tipusC ...
CREATE TYPE tipusABC (A tipusA,B tipusB, C tipusC);
utana a plsql-ben
declare
recA record;
recB record;
recC record;
begin
recA:=null;
recB:=null;
recC:=null;
--kikeresed melyik kell, es recA nak vagy B vagy C-nek adod az ertek
return row(recA,recB,recC);
end;
select fv(1); pedig ezt adja kb
A | B | C
----------
{12,bla bla}| |
de ezt felhasznalhatod igy
select (A).*,(B).*, (C).* from fv(1);
select (A).nev,(B).tipus,(C).datum from fv(1);
remelem segitettem
- A hozzászóláshoz be kell jelentkezni
A 3 táblában (A, B, C) 3 különböző típusú dolgok tulajdonságait tárolom. (Gondoltam arra is, hogy egy táblába összevonom, de az eltérő mezők miatt sok lenne a NULL érték.) A T táblában meg tulajdonképpen egy (visszafelé) láncolt lista van tárolva, melynek elemei az A, B, C táblákban vannak.
A fv.-t úgy szeretném megírni, hogy a láncolt lista minden elemét le tudjam kérdezni. (Az alkalmazásban fel is építem ezt a listát.)
Úgy képzeltem el, hogy a fv. egy olyan táblával tér vissza, melynek sémája az A, B, C táblák mezőinek uniója valamint egy mező, ami azt tartalmazza, hogy melyik táblából van a rekord. Ebben az esetben lesz sok NULL érték, de talán szebb megoldás, mint a 3 tábla összevonása.
Köszi a javasolt megoldást, megnézem részletesebben!
- A hozzászóláshoz be kell jelentkezni
deleted
- A hozzászóláshoz be kell jelentkezni
felejtsd el az a,b,c tablat.
cimkezz!
pl.
kod=1
nev=alma
tipus=kerek
szin=piros
allag=kasas
eseten ugye a tabla igy nezne ki:
kod,nev,tipus,szin,allag
de ha ugyanebben a methodusban akar az ember autot, vagy szamitogepet adni, akkor ugye nem biztos hogy illik ra jopar oszlop.
erre inkabb a cimkezos megoldas a jo.
valoszinu, hogy kod es nev mindben szerepel. ezert kell egy torzstabla, amiben szerepel a (kod (serial, pkey) ,nev varchar(50),szulo int4)
a masik pedig a parameter tabla
ami pedig a (kod int4, nev varchar(20), ertek text)
torzstabla tartalma ekkor:
1 | almam
2 | autom
parameter tabla pedig:
1 | szin | zold
1 | allag | kasas
1 | forma | kerek
1 | darab | 12334
2 | szin | piros
2 | tipus | mazda
2 | rndsz | ABC123
2 | forg erv | 2099.01.01
2 | alvazszam |ASDF1234A1234
2 | motorszam | MTFSW242SF2411
itt viszont az okoz gondot, hogy lekerdezeskor nehez rekordba tenni az adatokat.
de ha fix tipusok vannak, akkor lehet ra annyi view-t csinalni ahany tipusod van.
- A hozzászóláshoz be kell jelentkezni
Szervusz !
két dologgal kell kezdenem:
1. nem igazán értem így elvontan a problémát
2. MySQL-t használok.
De: lehet, hogy JOIN-t kell használnod.
én pl RIGHT JOIN-t szoktam hasznáni, akár 3-4 láncolt táblából is összeszedi az információt.
Olvass! (manual, példaprogramok) Kísérletezz!
CSZ
- A hozzászóláshoz be kell jelentkezni
Köszönöm mindkettőtöknek a választ!
A legjobb megoldást még nem volt időm megtalálni, de az általatok javasolt úton már el fogok tudni indulni.
- A hozzászóláshoz be kell jelentkezni