Avatar billede sunero Nybegynder
18. maj 2005 - 11:18 Der er 12 kommentarer og
2 løsninger

Outer join

Hejsa

Jeg har føljende tabeller

Kategori
- KatId
- Navn

Picture
- PicId
- RefId
- RefTable

Jeg vil gerne have skrevet en liste ud over samtlige kategorier med tilhørende billeder (Kategori.Navn,Picture.PicId).

Jeg er kommet frem til følgende :

SELECT kategori.Nave,Picture.PicId
FROM kategori LEFT JOIN Picture ON kategori.KatId=Pic.PicId;

Men jeg mangler stadig at indsætte RefTabel, som kunne være "Kategori".

jeg har prøvet med :

SELECT kategori.Nave,Picture.PicId
FROM kategori LEFT JOIN Picture ON kategori.KatId=Pic.PicId AND Pic.RefTabel = "kategori";

men det virker ikke.
Hvordan gør jeg dette?
Avatar billede thesurfer Nybegynder
18. maj 2005 - 11:24 #1
Måske kan du bruge det her til noget: http://www.w3schools.com/sql/sql_join.asp
Avatar billede imago-dei Nybegynder
18. maj 2005 - 11:47 #2
Hvis du enten ved at alle kategorier har billeder, eller du kun vil hava kategorier, sum har billeder, skal du bruge en inner join.

Hvis du vil have alle kategorier, også dem, som ikke har billeder skal du bruge en left outer join. Men mangler du ikke et KatId i din picture tabel?

Jeg ville lave det således:
Kategori
- katId
- Navn

Picture
- PicId
- KatId
- RefId
- RefTable

Og joine således:

SELECT kategori.Navn, Picture.PicId
FROM kategori LEFT OUTER JOIN picture ON kategori.KatId = Pic.KatId;
Avatar billede terry Ekspert
18. maj 2005 - 20:46 #3
if you use Access's query builder its just a case of dragging and dropping the tables into the query builder window and then dragging and dropping the primary key over to the foreign key field. Then right click on the thin line (relationship) and alter the realationship type to LEFT or RIGHT OUTER join.
Avatar billede sunero Nybegynder
19. maj 2005 - 08:33 #4
imago-dei >>
Jeg skal bruge Picture til andre tabeller end kun kategori. dvs. at min picture tabel kunne komme til at se således ud og at rækkerne med * er dem der skal udsøges når jeg skal finde billeder til mine kategorier :

PicId RefId RefTable
1    1    "Kategori"  *
2    1    "emne"
3    2    "emne"
4    3    "enme"
5    2    "kategori" *

RefId'et kan altså pege hen på både KatId og EnmeId.
Avatar billede imago-dei Nybegynder
19. maj 2005 - 08:58 #5
Sunero jeg ved måske ikke helt hvad du mener... Prøv at forklar hvad alle kolonnerne indeholder af data. Er RefId en foreign key fra Kategori tabellen? Eller måske en reference til nøgler i forskellige tabeller?

Hvis det er det sidste vil jeg heller råde dig til at lave det om således at du i Picture tabellen har en kolonne for hver tabel, således at hvis tabellen du skal søge i er Kategori, så står der et tal i KatId kolonnen, og null i de andre kolonner med foreign keys.

Men prøv at give et mere komplet eksempel på dine tabeller hvis jeg har misforstået dig.
Avatar billede sunero Nybegynder
19. maj 2005 - 09:15 #6
imago-dei >>
Det er korrekt at RefId er reference til nøgler i forskellige tabeller, men det burde da kunne løses, når RefTable angiver hvilken tabel der refereres til. Jeg har måske en 10-12 tabeller hvortil der kan refereres, og det må da kunne laves uden at man skal oprette 10 nye felter i Picture-tabellen.

Hver gang jeg laver en select, bruger jeg kun en af tabellerne f.eks. kategori. Så det må være noget lignende dette der skal til :

SELECT kategori.Nave,Picture.PicId
FROM kategori LEFT JOIN Picture ON kategori.KatId=Pic.RefId

Problemet er bare, at der godt kan være 2 eller flere ens RefId'er. Dette skal løses ved at kigge på RefTable som i mit eksempel skal være "Kategori"
Avatar billede imago-dei Nybegynder
19. maj 2005 - 09:24 #7
Naturligvis kan det løses. Jeg siger bare at dit design er ikki optimalt (databasen er vist ikke normaliseret).

Men jeg vil mene at nedenstående skulle virke

SELECT kategori.Nave,Picture.PicId
FROM kategori LEFT JOIN Picture ON kategori.KatId=Pic.RefId WHERE Pic.RefTabe = 'kategori';
Avatar billede sunero Nybegynder
19. maj 2005 - 09:34 #8
Når jeg kører :

SELECT kategori.Nave,Picture.PicId FROM kategori LEFT JOIN Picture ON Kategori.KatId=Pic.RefId WHERE Pic.RefTabe = 'kategori';

Får jeg kun de kategorier med Picture tilknyttet. Alle kategorier uden picture kommer ikke med. Er det mig der gør noget forkert ?
Avatar billede imago-dei Nybegynder
19. maj 2005 - 09:44 #9
Nej, igen er det lidt svært at sige da jeg ikke kender opbygningen af databasen og dens indhold. Ovenstående query joiner tabellerne picture og kategori hvor kategori.katid = pic.RefID _og_ henter alle rækker hvor katid er null. Hvis du vil have _alle_ kategorier må du nok lave en ny select, som henter alle kategorier og lave en UNION mellem de to resultater.
Avatar billede sunero Nybegynder
19. maj 2005 - 09:52 #10
Forsimplet ser min DB således ud :

Kategori
- KatId
- Navn

KatId Navn
1    Danmark
2    England
3    Tyskland
4    Sverige


Enme
- EnmeId
- Navn

EnmeId Navn
1      Fodbold
2      Håndbold
3      Tennis
4      Badminton

Picture
- PicId
- RefId (EnmeId eller KatId)
- RefTable ("enme" eller "kategori")

PicId RefId RefTable
1    1    "Kategori" 
2    1    "emne"
3    2    "emne"
4    3    "enme"
5    2    "kategori"

Det jeg gerne vil have ud er :

Navn      PicId
Danmark    1
England    5
Tyskland
Sverige

Eller i en anden query
Navn      PicId
Fodbold    2
Håndbold    3
Tennis      4
Badminton


Jeg sætter lige lidt flere points på spørgsmålet.
Avatar billede imago-dei Nybegynder
19. maj 2005 - 10:33 #11
Jeg må indrømme at jeg tog lidt fejl før.. I en left outer join får du ALLE rækker i venstre tabel og kun de rækker som matcher i din join condition (kategori.KatId=Pic.RefId). Grunden til at du ikke får alle kategorier er where klausulen, som siger at den kun skal hente rækker hvor der er et billede til tabellen 'kategori'.

Prøv

SELECT kategori.Navn,Picture.PicId FROM kategori LEFT JOIN Picture ON Kategori.KatId=Picture.RefId WHERE Picture.RefTabe = 'kategori' OR Picture.RefTable IS NULL;
Avatar billede sunero Nybegynder
19. maj 2005 - 11:52 #12
Det var lige hvad jeg havde brug for. Tusind tak. Men jeg forstår ikke helt "OR Picture.RefTable IS NULL"
Avatar billede imago-dei Nybegynder
19. maj 2005 - 12:10 #13
En left outer join tager alle rækker i venstre tabel og de rækker i højre tabel, som matcher på join kriteriet. Dvs. at der kan være rækker i venstre tabel (i dit tilfælde i kategori tabellen) som _ikke_ har tilsvarende rækker i billede tabellen. I de tilfælde hvor der ikke er billeder som hører til kategorien kommer der til at stå null i kolonnerne fra picture tabellen. Alle kolonner fra begge tabeller sættes sammen i join operationen. Select henter så de relevante rækker og kolonner bagefter.
Avatar billede sunero Nybegynder
19. maj 2005 - 12:12 #14
ahh, på den måde. Endnu engang tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester