Ehm... no ...sklamal som sa... V tomto jednoduchom priklade to vyzera skor na preklep (staci si skladat dynamicky SQL a v pohode ten preklep urobite), ale napisete mi query, ktore da zoznam vsetkych zamestnancov a ich prace neschopnosti, ktore trvali viac ako 10 hodin...
Totiz to Vase zadani neni jednoznacne. Budto chcete vsechny zamestnance nebo chcete ty, jejichz pracovni neschopnost presahla 10 hodin. Pouze v pripade, ze by vsichni zamestnanci byli nemocni dele nez 10 hodin, tak lze na ni odpovedet. Jinak ty Vase priklady jsou presne tou ukazkou proc striktne pouzivat JOIN ON, ale korektne zapsany (nikoliv s Vasi zamernou chybou). Pak muzete bezpecne menit INNER JOIN na OUTER JOIN a nedockate se prekvapeni. Na neco podobneho jsem narazil v manualu k 7 MSSQL, kde ukazovali vyhody JOINU vuci klasickemu spojeni vyctem v FROM.
Pointa je IMO inde. Vo Vasom clanku pracujete s SQL ako s matematickym aparatom na papieri. Realita je vsak ina. Je fajn, ak autori SQL aspon trochu vedia uvazovat v zmysle postupov, ktore DB pri execucii pouzije.
Ja chapem, ze konkretne pripady potrebuju konkretne riesenia, no minimalne mi vadi, ze v texte chybaju detaily, ktore prave zacinajucich maju upozornit, ze aj ked nieco VYZERA rovnako, seredne sa mylia, ak cakaju, ze to aj PRACUJE rovnako!
Uviedol som priklad na outer join, ale mozem uviest dalsi - v texte nepriamo tvrdite, ze NOT IN a NOT EXIST su rovnake...
Urcite v takomto clanku nebol priestor na mnoho a mnoho detailov (strankovanie, indexy, scan a seek po nich atd). Tento fakt ale nic nemeni na veci, ze text sa da doplnit a dopracovat. Casom ho mozno rozdelite na fajny naucny serial, ktory zaradim do povinneho citania mojich novych kolegov :-)
Preto prijmite podobne pripomienky skor ako napad na zamyslenie. Mojim cielom naozaj nie je si dokazovat, ze co a ako sa da a neda v SQL napisat...
PS: Ak by som sa vsak pri tom dostal do uzkych, popytam o radu firemneho DB specialistu ;-)
PS2: Naozaj som tento clanok cital v nadeji, ze ho pouzijem ako studijny material pre novych kolegov.
PS3: Bestrestne sa zamienat INNER za OUTER hadam ani neda... Nakolko sa meni vysledna mnozina a nastupuju NULL... Ale poznanie, ze bacha na outer join vie vela napomoct.
PS4:Ano mal som byt v zadani doslednejsi!
Ale myslel som si, ze je to take jednoduche manazerske - z praxe:
Chcem vsetkych v zozname kedy a kolko chybali. Filtrujte mi len dni, ked chybali nad 10 hodin. A nech su tam vsetci aj ked mali menej ako 10 hodin, potom nech je tam 0 - male vymeskanie ma nezaujima. Potrebujem si na pohovore tento zoznam otvorit a rychlo skontrolovat kedy a kolko blicovali...
PS5: Idem spat a do zajtra na nasu konverzaciu asi zabudnem... Vela stastia pri pisani dalsich getting started a inych fajnych veci...
Pri programovani se musi davat pozor na detaily. To je samozrejmost. Utece Vam carka a padaji rakety. To, co tu navrhujete patri spis do firemniho now-how. Clanek byl urcen hlavne pro zacatecniky. Dalsi priklady by text jeste vic rozmelnily. Samozrejme, ze takhle se casto chybuje (copy/paste chyby). SQL je neskutecne variabilni i co se tyce chyb, ktere se daji udelat. Ale ja se setkavam s tim, ze programatori s nekolikaletou praxi netusi v cem je rozdil mezi INNER a OUTER JOINEM. To bylo hlavni motto clanku.
Doufam, ze tam nikde neni ze NOT IN a NOT EXIST jsou stejne. To, ze pomoci nich mohu napsat variace jednoho dotazu je uz neco jineho. A vsimnete si, prikaz s NOT IN vypada jinak nez s NOT EXISTS. Dale je tam poznamka, ze EXISTS vede ke korelovanemu dotazu, ktery je zpravidla ten nejpomalejsi.
Vasim kolegum doporucte precist si Joe Celka. Jsou to pomerne utle knizky, byt v anglictine, a myslim si, ze je tam to, co by Vas zajimalo.
Pokud bych to mirne preformuloval. Chci zaznamy vsech zamestnancu, a jejich pracovni neschopnosti, s tim, ze u zamestnancu, kteri maji p.n. mene nez 10h zobraz nulu. Je to ono?
SELECT jmeno, prijmeni, CASE
WHEN pocet IS NULL THEN 0
WHEN pocet <= 10 THEN 0
ELSE pocet END
FROM Zamestnanci z
LEFT JOIN
PracovniNeschopnosti p
ON z.id = p.zam_id;
Vase query sice vyberie vsetkych zamestnancov, dokonca aj spravne zobrazi tu 0, ako ste v zadani definovali...
Ad1. Akurat, ze pre Fera XX, ktory bol doma 3krat, no iba raz dlhsie ako 10 hodin budeme mat celkovo zaznamy 3!
Ad2. Dufajte, ze Vam niekto nepriklepne ciselnik typov nepritomnosti a nebude chciet jeho popis do zoznamu.
PS: Suhlasim, ze priklad nebol stastne zvoleny, no prave tutu ficuriu outer joinov som dufal, ze spomeniete...