Posted By: Jovo () on 'CZdatabases' Title: Jovo 3 Date: Sat Oct 21 12:27:20 2000 Z Jovova zapisniku - 3:"Setreni prace (1)" ========================================== Narazil jsem na paradni trik. Situace : mame par projektu a na nich pracuji lidi : TABLE lidi TABLE projekt1 TABLE projekt2 TABLE projekt3 id jmeno trida id id status id hodin ======================= ====== ============= =========== (serial) (char10) (int) (int) (int) (char1) (int) (int) ----------------------- ------ ------------- ----------- 1 Pepa 15 1 3 "A" 3 15 2 Venca 10 2 2 "+" 3 Jiricek 15 5 "N" 4 Pavla 45 5 Lida 18 (pro puristy: vase namitka, ze by se projekt1,2,3 dal zdrcnout do jedne tabulky, kde by bylo navic cislo projektu, je spravna. Zde jde o modelovy pripad - id z "lidi" se dovazi i jinam a tabulky nemaji stejne sloupce.) Ukol, zpracovat vsechny lidi, kteri maji nejakou tridu (my zvolime trida>5, aby se vybrali vsichni) a pracuji na nejakem projektu. Select * from lidi where trida vyhovuje podmince AND nekde pracuji Reseni je nekolik: 1] vic selectu za sebou SELECT * FROM lidi, projekt1 WHERE trida>5 AND lidi.id = projekt1.id; zpracuj_dotaz ....; SELECT * FROM lidi, projekt2 WHERE trida>5 AND lidi.id = projekt2.id; zpracuj_dotaz ....; SELECT * FROM lidi, projekt3 WHERE trida>5 AND lidi.id = projekt3.id; zpracuj_dotaz ....; 2] select budeme konstruovat. Tento postup se hodi, kdyz mame tabulky a sloupce v nejake pekne relaci (napr. zde vazba projekt?<->lidi jde pres id, a jmena tabulek se lisi jen cislem funkce vrat_retez(int num) { RETURN "SELECT * FROM lidi,projekt" + num + "WHERE trida>5 AND lidi.id = projekt" + num }; LET dotaz = vrat_retez(1); spust_dotaz;zpracuj_dotaz ....; LET dotaz = vrat_retez(2); spust_dotaz;zpracuj_dotaz ....; LET dotaz = vrat_retez(3); spust_dotaz;zpracuj_dotaz ....; nebo FOR n=1 TO 2 DO LET dotaz = vrat_retez(n); spust_dotaz;zpracuj_dotaz ....; END - pozn.: Pokud by se tabulky jmenovaly jinak, musi se pozmenit i funkce vrat_retez :-) 3] "oblibeny" union SELECT * FROM lidi, projekt1 WHERE trida>5 AND id IN ( SELECT id FROM projekt1 UNION SELECT id FROM projekt2 UNION SELECT id FROM projekt3 ); zpracuj_dotaz ....; - prednosti : - UNION automaticky vyhazuje duplicity (zde id 2 a 3) - jenom jeden select - vady : - SELECT je slozeny - kdyz je to nad vic tabulkami a vazba jde pres vicero sloupcu, tak uz to neni tak prehledne a spatne se to ladi - UNION automaticky vyhazuje duplicity :-) nekdy potrebujeme i duplicitni zaznamy (ne zrovna v tomto pripade). Takze pokud bych mel neco doporucit pak (3), potom (2) a kdyby to nefungovalo, tak (1). Videl jsem lidi, kteri zacali od (1) a prepsali ho do zpusobu (3). Nevim jak vy, ale me kdyz to funguje, tak se snazim do toho moc nevrtat a vam doporucuji v opravnenych pripadech totez :-) Vas Jovo.