Vinnaren i pepparkakshustävlingen!
2009-12-26, 17:59
  #1
Medlem
Hej!
Är nybörjare inom databaser och har stött på ett problem som jag inte riktigt vet vad det beror på. Håller på att skapa en enkel och relativt liten databas som hanterar en fiktiv film samling. Problemet nu när jag skapat mina 4tabeller och lagt in data i dessa har jag problem att få fram den informtaion som jag behöver. Använder mig av queries och så länge jag söker innom sammma tabell är det inga problem.

SELECT kategori
FROM Film
WHERE titel LIKE 'Gudfadern';

Frågor som denna fungerar som dom ska men om jag behöver ha informtaion från flera tabeller får jag inte fram någon data. Vet inte om det beror på att jag missat nåt i mina relationer eller om jag använder mig av fel SQL- satser.

Ungefär såhär ser mina 4 tabeller ut. Regissör har en relation till Film, Film har en relation till Roll och Roll har en relation till Skådespelare.

Kod:
Regissör                  Film                Roll                        Skådespelare
--------                 --------          --------                  --------
regissörNr {PK}        filmNr {PK}       filmNr {PPK}            skådespelarNr {PK}
--------                 --------          --------                  --------
regissörNamn           titel                skådespelarNr {PPK}  skådespelarNamn 
Då undrar jag hur jag ska kunna få reda på t.ex. vilken skådespelare som har varit med i en viss film. Dessa SQL satser får inte fram något värde alls. Det dyker upp en ruta där det står "Enter parameter value". Vet ej vad det innebär.

SELECT skådespelarNamn
FROM Skådespelare
WHERE titel LIKE 'Gudfadern';

Skulle uppskatta hjälp och kommentarer om någon vet om det är mina relationer som är helt åt helvete eller om jag skriver fel SQL- satser.
Tack på förhand och God Jul
Citera
2009-12-26, 19:10
  #2
Moderator
Protons avatar
Kod:
SELECT skådespelarNamn
FROM Skådespelare
WHERE titel LIKE 'Gudfadern';
En sån där SQL hade funkat utan problem om titel hade varit ett attribut i Skådespelare. Det är det ju inte nu som väl är(dvs du har normaliserat databasen lite).

Felet beror således på att din databasmotor(antar att det är access) inte har en aning om hur skådespelare och titel hänger ihop. Detta har inget med hur du har ritat dina relationer att göra, utan det här är ett semantiskt fel i din SQL.

Du måste manuellt, i din SQL, explicit ange hur tabellerna hänger ihop. Detta görs med en INNER JOIN, eller så kan du ange detta i WHERE-villkoret med.

Hade du skrivit din SQL såhär:
Kod:
SELECT skådespelarNamn
FROM Skådespelare
INNER JOIN Roll ON Roll.skådesplarnr = Skådespelare.skådespelarNr
INNER JOIN Film ON Film.filmNr = Roll.filmNr
WHERE titel LIKE 'Gudfadern'
Hade det fungerat troligen, eftersom du nu talar om hur dina tabeller hänger ihop. Att göra det i WHEREsatsen funkar som sagt med, men det tenderar att bli smetigare, speciellt om man har mer än ett wherevillkor:
Kod:
SELECT skådespelarNamn
FROM Skådespelare
WHERE Film.titel LIKE 'Gudfadern'
AND Film.filmNr = Roll.filmNr
AND Roll.skådespelarNr = Skådespelare.skådespelarNr
Så kan det se ut med. Observera att förutsättningen för att en INNER JOIN ska kunna funka är att det finns en post med samma PK/FK i bägge tabellerna som du joinar ihop, annars får du inte ut nånting alls.

Läs på om JOINs så kommer det klarna för dej.

http://en.wikipedia.org/wiki/Join_(SQL

Slutligen skulle jag fortsättningsvis avråda dej från att använda svenska tecken i dina tabell och attributnamn. Kan ställa till mkt bekymmer för dej längre fram.
Citera
2010-02-05, 21:18
  #3
Medlem
Vet inte om det var så du menade men jag brukar bara använda LIKE i de fall jag inte vet det exakta namnet och i så fall måste du väl skriva LIKE ='%Gudfadern%' i detta fallet får du med alla som heter t.ex. Gudfadern Gudfadern I Gudfadern II osv
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback