Hlavní navigace

Vlákno názorů k článku [ ( LEFT|RIGHT [ OUTER ])| INNER ] JOIN v SQL od anonym - Myslim, ze je viac detailov (skusenosti z praxe),...

  • Článek je starý, nové názory již nelze přidávat.
  • 3. 12. 2007 21:13

    anonymní
    Myslim, ze je viac detailov (skusenosti z praxe), ktore by bolo potrebne spomenut, no neda mi zdoraznit klasicku pascu na zacinajucich SQL guru...

    SELECT *
    FROM Zamestnanci z
    JOIN PracovniNeschopnosti n ON z.id = n.zam_id
    AND n.pocet > 10

    vs.

    SELECT *
    FROM Zamestnanci z
    JOIN PracovniNeschopnosti n ON z.id = n.zam_id
    WHERE n.pocet > 10

    vs.

    SELECT *
    FROM Zamestnanci z
    LEFT JOIN PracovniNeschopnosti n ON z.id = n.zam_id
    AND n.pocet > 10

    vs.

    SELECT *
    FROM Zamestnanci z
    LEFT JOIN PracovniNeschopnosti n ON z.id = n.zam_id
    WHERE n.pocet > 10
  • 3. 12. 2007 22:05

    Pavel Stěhule
    Proto je duležité nepsat jak dobytek :)). A držet se ověřeného: Císařovo císaři, papeži papežovo..
  • 3. 12. 2007 22:52

    anonymní
    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...
  • 3. 12. 2007 23:06

    Pavel Stěhule
    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.
  • 4. 12. 2007 1:33

    anonymní
    Moja chyba, moja chyba, moja chyba...

    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...
  • 4. 12. 2007 7:17

    Pavel Stěhule
    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.
  • 3. 12. 2007 23:32

    Pavel Stěhule
    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;
    
  • 3. 12. 2007 23:50

    anonymní
    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...