SQL-JOIN

Minulla on kolme taulua:
tyontekijat (tyontekijanro, sukunimi, etunimi, jne)
lainaukset (lainausnro, tyontekijanro, tyokalunro, jne)
tyokalut (tyokalunro, nimke, jne)

tehtävä 1

Hae kaikkien(myös niiden työntekijoiden, jotka eivät ole lainanneet) nimi ja lainausten määrä

Tämä toimii:

SELECT sukunimi, etunimi, COUNT (lainauspvm) AS lainaustenlkm
FROM tyontekijat LEFT OUTER JOIN lainaukset ON tyontekijat.tyontekijanro=lainaukset.tyontekijanro
GROUP BY sukunimi, etunimi

(Access tosin poistaa OUTER-sanan)

tehtävä 2
Hae kaikkein työntekijöiden nimi ja lanausten lukumäärä työkaluittain ryhmiteltynä
yritin näin

SELECT sukunimi, etunimi, nimike, COUNT(lainauspvm) AS lainaustenlkm
FROM tyontekijat LEFT OUTER JOIN ( tyokalut INNER JOIN lainaukset ON tyokalut.tyokalunro=lainaukset.tyokalunro) ON tyontekijat.tyontekijanro=lainaukset.tyontekijanro
GROUP BY sukunimi, etunimi, nimike

access vastaa liitoslauseke ei tuettu
Auttakaa, help pliis, pitäis saada se todistuskin ;-)
8624
Äänestä

Muut lukivat myös

Vastaukset 8

Vanhimmat

"LEFT OUTER JOIN" -> "LEFT JOIN"

Äänestä
  • Access vaan ilmoittelee, ettei lauseke ole tuettu.

    Äänestä

  • Sama kirjoitti:

    Access vaan ilmoittelee, ettei lauseke ole tuettu.

    Ok. Ongelma voipi myös johtua sitä, että left joinia ei voi yhdistää inner joiniin ihan miten vain. Kokeile allaolevaa..


    SELECT tyontekijat.sukunimi, tyontekijat.etunimi, tyokalut.nimike, Count(lainaukset.lainauspvm) AS CountOflainauspvm
    FROM (tyokalut RIGHT JOIN lainaukset ON tyokalut.tyokalunro = lainaukset.tyokalunro) RIGHT JOIN tyontekijat ON lainaukset.tyontekijanro = tyontekijat.tyontekijanro
    GROUP BY tyontekijat.sukunimi, tyontekijat.etunimi, tyokalut.nimike;

    Äänestä

  • Time is on My Side kirjoitti:

    Ok. Ongelma voipi myös johtua sitä, että left joinia ei voi yhdistää inner joiniin ihan miten vain. Kokeile allaolevaa..


    SELECT tyontekijat.sukunimi, tyontekijat.etunimi, tyokalut.nimike, Count(lainaukset.lainauspvm) AS CountOflainauspvm
    FROM (tyokalut RIGHT JOIN lainaukset ON tyokalut.tyokalunro = lainaukset.tyokalunro) RIGHT JOIN tyontekijat ON lainaukset.tyontekijanro = tyontekijat.tyontekijanro
    GROUP BY tyontekijat.sukunimi, tyontekijat.etunimi, tyokalut.nimike;

    TOIMII KIITOS!

    En vielä ehtinyt ymmärtää, kuinka se näin päin menee ja mikä vika minun kysellyssäni on, mutta ainakin opinnot etenevät ja harjoitustyö on valmis. (Paitsi jos insinööri pyytää perustelemaan, että miksi näin ;-)

    Miksi tuo right join kelpaa mutta left ei? Vai oliko minun kyselyssäni joku syntaksiongelma?

    Eiköhän tuo juhannukseksi selviä. Kiitos vielä kerran.

    Äänestä

  • ANJUSKA kirjoitti:

    TOIMII KIITOS!

    En vielä ehtinyt ymmärtää, kuinka se näin päin menee ja mikä vika minun kysellyssäni on, mutta ainakin opinnot etenevät ja harjoitustyö on valmis. (Paitsi jos insinööri pyytää perustelemaan, että miksi näin ;-)

    Miksi tuo right join kelpaa mutta left ei? Vai oliko minun kyselyssäni joku syntaksiongelma?

    Eiköhän tuo juhannukseksi selviä. Kiitos vielä kerran.

    sama olisi toiminut leftillä ihan ok. Luulen, että ongelmasi johtui seuraavasta:

    inner joineja voi yleensä ketjuttaa monen eri taulun välillä miten lystää. Sama ei kuitnekaan koske left (tai right) joinia.

    Voit tehdä näin:

    tauluA leftjoin tauluB leftjoin tauluC

    voit tehdä myös näin:

    tauluA innerjoin tauluB leftjoin tauluC

    Mutta et voi tehdä näin:

    tauluA leftjoin tauluB innerjoin tauluC

    Tuota ketjutusta ei vain voi tehdä yhdessä kyselyssä, koskapa relaatiosta tulee silloin ambigious (moniselitteinen).

    Ehkä joku Ullman:in Principles of Database Systems -opukset kahlannut osaisi selittää teoriaa tarkemmin..

    Äänestä

  • TioMS kirjoitti:

    sama olisi toiminut leftillä ihan ok. Luulen, että ongelmasi johtui seuraavasta:

    inner joineja voi yleensä ketjuttaa monen eri taulun välillä miten lystää. Sama ei kuitnekaan koske left (tai right) joinia.

    Voit tehdä näin:

    tauluA leftjoin tauluB leftjoin tauluC

    voit tehdä myös näin:

    tauluA innerjoin tauluB leftjoin tauluC

    Mutta et voi tehdä näin:

    tauluA leftjoin tauluB innerjoin tauluC

    Tuota ketjutusta ei vain voi tehdä yhdessä kyselyssä, koskapa relaatiosta tulee silloin ambigious (moniselitteinen).

    Ehkä joku Ullman:in Principles of Database Systems -opukset kahlannut osaisi selittää teoriaa tarkemmin..

    Kiitoksia vaan. Kaikki vaihtoehdot testataan. Kiva että yksinäiselle aikuisopiskelijalle on joku paikka,mistä kysyä neuvoa.

    Äänestä

  • ANJUSKA kirjoitti:

    Kiitoksia vaan. Kaikki vaihtoehdot testataan. Kiva että yksinäiselle aikuisopiskelijalle on joku paikka,mistä kysyä neuvoa.

    Hyvä jos neuvoista oli apua. Tulee sitä aina silloin tällöin lueskeltua näitä postauksia. Accessia on tullut pyöritettyä niin kauan, että suurimpaan osaan kysytyistä jutuista on itse joskus tullut törmättyä.

    Mutta: Kaikkea saa kysyä, vastataan jos osataan. Kysymysten pitää tosin liittyä vain ja ainoastaan tietokoneiden sielunelämään.. ;)

    Äänestä

Niin että mieluummin kyselet valmiin vastauksen ja saat huijaamalla sen todistuksesi kuin että yrittäisit oikeasti ymmärtää mitä menee pieleen?

Äänestä

Kommentoi aloitusta


ANJUSKA kirjoitti:

Minulla on kolme taulua:
tyontekijat (tyontekijanro, sukunimi, etunimi, jne)
lainaukset (lainausnro, tyontekijanro, tyokalunro, jne)
tyokalut (tyokalunro, nimke, jne)

tehtävä 1

Hae kaikkien(myös niiden työntekijoiden, jotka eivät ole lainanneet) nimi ja lainausten määrä

Tämä toimii:

SELECT sukunimi, etunimi, COUNT (lainauspvm) AS lainaustenlkm
FROM tyontekijat LEFT OUTER JOIN lainaukset ON tyontekijat.tyontekijanro=lainaukset.tyontekijanro
GROUP BY sukunimi, etunimi

(Access tosin poistaa OUTER-sanan)

tehtävä 2
Hae kaikkein työntekijöiden nimi ja lanausten lukumäärä työkaluittain ryhmiteltynä
yritin näin

SELECT sukunimi, etunimi, nimike, COUNT(lainauspvm) AS lainaustenlkm
FROM tyontekijat LEFT OUTER JOIN ( tyokalut INNER JOIN lainaukset ON tyokalut.tyokalunro=lainaukset.tyokalunro) ON tyontekijat.tyontekijanro=lainaukset.tyontekijanro
GROUP BY sukunimi, etunimi, nimike

access vastaa liitoslauseke ei tuettu
Auttakaa, help pliis, pitäis saada se todistuskin ;-)

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu