Vlákno názorů k článku [ ( LEFT|RIGHT [ OUTER ])| INNER ] JOIN v SQL od polymorpheus - diky za nej. Jeste by se hodil clanek...

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

    polymorpheus (neregistrovaný)
    diky za nej. Jeste by se hodil clanek o spravnem pouzivani indexu a jinych optimalizacnich technikach, protoze to je rozvnez duleza vec jinak takova drobnost: v tomto priklade:
    Zamestanci(id, oddeleni_id, jmeno, prijmeni, mzda)
    Oddeleni(id, nazev) 
    
    -- složený predikát
    SELECT jmeno, prijmeni, mzda, nazev
       FROM Zamestnanci z
            JOIN (SELECT oddeleni_id, max(mzda) AS max_mzda
                     FROM Zemestnanci
                    GROUP BY oddeleni_id) s
            ON z.oddeleni_id = s.oddeleni_id AND z.mzda = s.max_mzda
            JOIN
            Oddeleni o
            ON o.id = z.oddeleni_id;
    
    podle me ta druha podminka v tom prvnim joinu ('...AND z.mzda = s.max_mzda ...') uz nemusi byt, ale mozna se mylim, priklad jsme nezkousel jinak kazdemu, kdo chce poradne proniknout do taju SQL bych rozhodne doporucoval knihu Introduction to SQL. Sice je dost rozsahla, ale fakt stoji za to, fucked fakt
  • 3. 12. 2007 20:36

    Pavel Stěhule
    Ta podmínka tam být musí, protože pouze jedna není (jakákoliv) není v rámci této úlohy jednoznačná. Zaměstnanci, které chci vybrat, mají nejvyšší mzdu v rámci oddělení - tudíž jsou potřeba dvě kritéria (mzda, a oddělení). Pokud by tam bylo pouze oddělení, tak mi to vypíše všechny zaměstnance, pokud dám pouze mzdu, tak to zhavaruje v případě, že sekretářka v administrativě má 10K (nad ní je ovšem ředitel s 20K), a hlavní inženýr z vývoje má 10K.
  • 3. 12. 2007 21:33

    polymorpheus (neregistrovaný)
    tak jsem se holt chytil:) je to tak, ted jsem si dal tu praci, abych se presvedcil. Kazdopadne dekuji za opravu. Me je totiz mnohem blizsi a pochopitelnejsi zapis (bez nazvu oddeleni)
    SELECT jmeno, prijmeni from Zamestnanci
    WHERE (oddeleni_id, mzda) in 
        (SELECT oddeleni_id, max(mzda) AS max_mzda
        FROM Zamestnanci
        GROUP BY oddeleni_id)
    
    Bez te druhe podminky slouzi sice 'oddeleni_id' k propojeni obou tabulek ('z' a 's'; coz jsem si myslel, ze staci, kdyz v 's' se vybira max(mzda)), coz ovsem nebrani mysql v tom, vypsat vsechny zamestnance ('s' obsahuje vsechna 'oddeleni_id'; podminka rovnosti plati pro vsechny zamestnance), takze je opravdu nutna ta druha podminka. Fucked ze jo