Autor | Zpráva | ||
---|---|---|---|
ananasovapasta Profil * |
#1 · Zasláno: 19. 12. 2009, 18:02:39
Ahoj, mohli byste mi prosím pomoct s tímhle problémem , potřeboval bych nejak sestavit tyto dva dotazy :
vyber všechny zaměstnance, kteří mají všechny oddělení aktivní vyber všechny zaměstnance, pro něž není žádné oddělení aktivní přičemž tabulka zaměstnanců obsahuje ID zaměstnance a jméno a tabulka oddělení obsahuje ID zaměstnance a oddělení ( zaměstnanec může pracovat na více odděleních současně) Předem moc děkuji za pomoc, postačil by aspon nástin řešení tohoto problému :) Díky |
||
123456789 Profil * |
#2 · Zasláno: 19. 12. 2009, 18:15:19
Jestli může zaměstnanec pracovat na více odděleních současně, tak máš špatnou strukturu databáze. To proto, že v případě zaměstnance, který pracuje na více odděleních budeš mít zbytečně duplicitní záznamy v tabulce oddeleni (dané oddeleni se bude opakovat tolikrát, kolik zaměstnanců v něm bude pracovat). Tady by měl být vztah M:N a ne 1:N jak to máš nyní ty.
"vyber všechny zaměstnance, kteří mají všechny oddělení aktivní" "vyber všechny zaměstnance, pro něž není žádné oddělení aktivní" Nevidím tam žádný atribut, který by určoval, zda-li je daný zaměstnanec v daném oddělení aktivní. Takže prosím doplň informace a popřemýšlej o lepším návrhu, takhle s tím budeš mít akorát problémy. |
||
Nox Profil |
#3 · Zasláno: 19. 12. 2009, 18:15:29
jestli to chápu dobře, tak - v klauzuli WHERE použij IN případně NOT IN a za tím poddotaz do datbulky oddělení
|
||
123456789 Profil * |
#4 · Zasláno: 19. 12. 2009, 18:22:01
EDIT: Pokud by zaměstnanec mohl pracovat nejvýše v jednou oddělení, tak by potřeboval být v tabulce Zamestnanci cizí klíč do tabulky Oddeleni. To co máš ty vystihuje dobře situaci, kdy v daném oddělení může pracovat nejvýše jeden zaměstnanec a jeden zaměstnanec může pracovat současně ve více různých odděleních. Ale takové oddělení s nejvýše jedním zaměstnancem (navíc každé oddělení s nejvýše jedním zaměstnancem) asi moc obvyklé nebude...
|
||
ananasovapasta Profil * |
123456789:
> Nevidím tam žádný atribut, který by určoval, zda-li je daný zaměstnanec v daném oddělení aktivní. > > Takže prosím doplň informace a popřemýšlej o lepším návrhu, takhle s tím budeš mít akorát problémy. Dobre, pro priklad jsem to zjednodusil ,ale zapomnel sem uvest ze v tabulce oddeleni je jeste sloupec 'active' Nox: „jestli to chápu dobře, tak - v klauzuli WHERE použij IN případně NOT IN a za tím poddotaz do datbulky oddělení“ Mohl bys prosím uvést nějaký příklad takového dotazu ? díky :) 123456789: „Pokud by zaměstnanec mohl pracovat nejvýše v jednou oddělení, tak by...“ Zaměstnanec může být evidován v mnoha odděleních Moderátor Joker: Sloučil jsem tři příspěvky zaslané v rozmezí dvou minut do jednoho
|
||
Joker Profil |
#6 · Zasláno: 20. 12. 2009, 10:59:31
ananasovapasta:
Předpokládám: 1. O oddělení potřebujete evidovat více informací, než jen ID oddělení? 2. Oddělení asi může mít více než jednoho zaměstnance. 3. Chcete, aby i zaměstnanec mohl mít více než jedno oddělení. => Je to vztah M:N a chtělo by to tři tabulky: - tabulka s informacemi o odděleních - tabulka s informacemi o zaměstnancích - vazební tabulka ID oddělení - ID zaměstnance Dál už už si nejsem jistý: > "vyber všechny zaměstnance, kteří mají všechny oddělení aktivní" > "vyber všechny zaměstnance, pro něž není žádné oddělení aktivní" Co přesně znamená "aktivní"? Znamená "neaktivní", že zaměstnanec v tom oddělení nepracuje (neboli je to existence/neexistence vztahu mezi zaměstnancem a oddělením), nebo zaměstnanec může být součástí oddělení, které je "neaktivní" (neboli "aktivní"/"neaktivní" je vlastnost oddělení)? Nebo může jeden zaměstnanec být "neaktivní" člen nějakého oddělení, zatímco jiný zaměstnanec být "aktivní" člen daného oddělení (neboli "aktivní"/"neaktivní" je vlastnost vztahu mezi zaměstnancem a oddělením)? V prvním případě by to "aktivní" reprezentovala přítomnost nebo nepřítomnost záznamu ve vazební tabulce. Druhý případ by měl být reprezentovaný sloupcem v tabulce oddělení. Třetí případ by měl být reprezentovaný sloupcem ve vazební tabulce. |
||
Kajman_ Profil * |
#7 · Zasláno: 20. 12. 2009, 14:14:44
vyber všechny zaměstnance, kteří mají všechny oddělení aktivní
select z.* from oddeleni o left join zam2odd zo on o.idoddeleni=zo.idoddeleni and zo.aktivni=1 left join zamestnanci z on zo.id_zamestnance=z.id_zamestnance group by z.id_zamestnance having count(o.idoddeleni)=count(z.id_zamestnancce) vyber všechny zaměstnance, pro něž není žádné oddělení aktivní select z.* from zamestnanci left join zam2odd zo on zo.aktivni=1 and zo.id_zamestnance=z.id_zamestnance where zo.id_zamestnance is null |
||
ananasovapasta Profil * |
#8 · Zasláno: 20. 12. 2009, 21:46:47
díky :) nějak jsem se s tím popral :)
|
||
Časová prodleva: 16 let
|
0