[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tietokannat] Re: Accessing relationships ikkuna
> Aloitin ht:n teon Accessilla kirjoittamalla SQL lauseet joilla
> loin taulut, sitten järjestin taulut ja viite-eheydet relation-
> ships ikkunassa suunnitelmaa vastaavaksi. Mutta nyt jostain ih-
> meen syystä relationships ikkunaan on ilmestynyt uusia tauluja
> joita siellä ei tosiaankaan pitäisi olla. Taulut ovat
> kopioita luomistani, niiden nimien perässä on 01, 02 jne sen tau-
> lun mukaan mistä ne näyttävät kopioituneen. Kuitenkaan näitä tauluja
> ei näy 'Tables' välilehdellä, vaan siellä on alkuperäiset taulut kuten
> pitääkin.
Ne ovat vain relationships-kuvassa näkyviä kopioita siitä yhdestä ja
ainoasta taulusta, jonka olet luonut. Jos yhdestä taulusta on kaksi
viittausta toiseen tauluun niin access monistaa kuvaan viitattavan taulun,
koska se ei osaa piirtää muuten näkyviin kahta viivaa.
Jos painaa oikeata hiiren nappulaa relationships-ikkunassa ja valitsee
ponnahdusvalikosta Show Table niin pääsee lisäilemään kaavioon kopioita
tauluista. Access nimeää kopiokuvat yllämainitsemallasi tavalla.
> Voisiko tämä johtua siitä olen huomaamattani suorittanut taululuja
> luovia SQL komentoja? Kanntaisiko siis poista KAIKKI olemassa olevat
> taulut (ja menettää niihin syötetty data) ja suorittaa SQL lauseet
> uudelleen oikeassa järjestyksessä?
Ei. Voit ihan vain deletellä poistella relationship-kuvassa olevat
ylimääräiset taulut.
> Minulla on jarjoitustyössäni taulu nimeltä 'aurinkokunta' ja siihen
> 1 TO M suhteilla taulut 'tähdet' ja 'komeetat'. Haluaisin kyselyn
> jolla kysyy käyttäjältä aurinkokunnan nimen ja listaa sitten aurinko-
> kunnan nimen ja kuinka monta tähteä ja komeettaa siihen kuuluu.
>
> Olen yritellyt seuraavanlaista:
>
> SELECT Aurinkokunta.Nimi, COUNT(TahtiID) AS Tähtien_lkm,
> COUNT(KomeettaID) AS Komeettojen_lkm
> FROM Aurinkokunta, Tahti, Komeetta
> WHERE Tahti.AurinkokuntaID =Aurinkokunta.AurinkokuntaID
> AND Komeetta.AurinkokuntaID =Aurinkokunta.AurinkokuntaID
> AND Aurinkokunta.Nimi = []
> GROUP BY Aurinkokunta.Nimi;
>
> Esimerkiksi aurinkokunnassa, jonka nimi on 'Sol' on yksi (1)
> tähti ja kaksi (2) komeettaa, mutta yo. haku kuitenkin
> näyttää että ko. aurinkokunnassa on kaksi komeettaa sekä
> sekä kaksi tähteä.
Yritäpä hakea näkyyviin pelkästään aurinkokunnan nimi, tahden id
ja komeetan id niin ymmärrät miksi lasku menee väärin. Tuloksena on
jotakin seuraavanlaista:
Nimi | TahtiID | KomeettaID
Sol | 1 | 1
Sol | 1 | 2
Eli rivejä tulee kaksi, koska komeettoja on kaksi. TahtiID toistuu sitten
jokaisella rivillä. Jos tähtiä olisi myös kaksi niin rivejä tulisi neljä
eli kaikki mahdolliset yhdistelmät mitä tauluista annetuilla ehdoilla
saadaan. Kovin yksinkertaisesti tuosta ei saa toimivaa kyselyä vaan pitää
jakaa useammaksi kyselyksi.
Tietokannan rakennetta muuttamalla tuo onnistui niin, että tahdet ja
komeetat olisivat samassa taulussa ja niistä löytyisi vain erillinen
luokittelutieto, joka kertoisi aina onko kyseessä tähti vai komeetta. Tuo
ei kuitenkaan välttämättä onnistu jos tähdistä ja komeetoista pitää
tallentaa erilaisia tietoja.
Nykyisellä rakenteella voitaisiin luoda kaksi näkymää, joista toinen
laskee komeettojen ja toinen tähtien lukumäärän. Nämä voitaisiin sitten
edelleen yhdistää kolmannella kyselyllä. Accessissa voidaan jokaista
kyselyä käyttää suoraan aivan kuin näkymää tai taulua muissa kyselyissä.
Joissakin muissa ympäristöissä näkymä pitää luoda CREATE VIEW -komennolla.
Accesissa voi seuraavista jättää nuo CREATE VIEW -osat pois ja vain
tallentaa kyselyt näkymän nimellä.
CREATE VIEW Tahdet
SELECT AurinkokuntaID, COUNT(TahtiID) AS Lkm
FROM Tahti
GROUP BY AurinkokuntaID
CREATE VIEW Komeetat
SELECT AurinkokuntaID, COUNT(KomeettaID) AS Lkm
FROM Komeetta
GROUP BY AurinkokuntaID
SELECT Aurinkokunta.Nimi, Tahdet.Lkm, Komeetat.Lkm
FROM Aurinkokunta, Tahdet, Komeetat
WHERE Aurinkokunta.AurinkokuntaID = Tahdet.AurinkokuntaID
AND Aurinkokunta.AurinkokuntaID = Komeetat.AurinkokuntaID
> Entä miten kyselyn saa näyttämään tuloksen myös silloin kun
> lukumäärä on nolla?
Käytetään ulkoliitosta niin saamme mukaan myös sellaiset aurinkokunnat
joille ei löydy vastiketta tähti- tai komeetta-tauluista. Muutetaan
edellisiä kyselyjä siis näin:
CREATE VIEW Tahdet
SELECT AurinkokuntaID, COUNT(TahtiID) AS Lkm
FROM Aurinkokunta LEFT OUTER JOIN Tahti
ON Aurinkokunta.AurinkokuntaID = Tahti.AurinkokuntaID
GROUP BY AurinkokuntaID
CREATE VIEW Komeetat
SELECT AurinkokuntaID, COUNT(KomeettaID) AS Lkm
FROM Aurinkokunta LEFT OUTER JOIN Komeetta
ON Aurinkokunta.AurinkokuntaID = Komeetta.AurinkokuntaID
GROUP BY AurinkokuntaID
>
> Entä onko haussa mahdollistaa käyttää jokerimerkkejä`?
> esim. 'So*'?
On jos käyttää LIKE-operaattoria:
http://appro.mit.jyu.fi/faq/tietokannat.html#5
Tuo jokerimerkin käyttäminen kannattaisi kuitenkin liittää siihen
vaiheeseen jolloin käyttäjä on valitsemassa haluamaansa aurinkokuntaa ja
tälle kyselylle välitettäisiin vain ja ainoastaan tarkasti yksilöivä
aurinkokuntaID.
--
Tommi Lahtonen, tommi.j.lahtonen@jyu.fi, <URL: http://www.iki.fi/hazor/>
Beware of the man who knows the answer before he understands the question.
-- send "unsubscribe tietokannat" to majordomo@cc.jyu.fi to unsubscribe ---