Avatar billede anhansen Nybegynder
05. april 2004 - 13:23 Der er 23 kommentarer og
1 løsning

Hjælp til forespørgsel?

Hej alle.

Så har jeg igen rodet mig ud i sql'ens kroge.

Jeg skal have lavet et udtræk hvor jeg gerne vil joine en tabel - dog er det ikke alle emner der har en reference til denne tabel.

I mit udtræk vil jeg gerne vise alle fra tabel1 også dem der ikke har nogen reference til tabel2. Dvs den skal ikke inner join - da den så kun tager dem som har alle reference iorden.

Derudover vil jeg gerne filtrere på værdier i tabel2 - men stadig bevare dem som ikke har nogen reference. Dvs jeg skal ende med alle dem der ikke har en reference - plus dem der har en reference betinget på noget.

Er der nogle der kan hjælpe her?
Avatar billede anhansen Nybegynder
05. april 2004 - 13:24 #1
Det skal måske lige siges at der under den som måske ikke er refereret kommer et "hierarki" af tabeller også som skal joines - selvfølgelig kun hvis referencen er der..
Avatar billede arne_v Ekspert
05. april 2004 - 13:26 #2
Mit bud:

SELECT *
FROM tabel1 LEFT JOIN tabel2 ON tabel1.id=tabel2.id
WHERE tabel2.f = X OR tabel2.f IS NULL
Avatar billede anhansen Nybegynder
05. april 2004 - 13:31 #3
ok... så hvis jeg bare bruger null som ekstra option hver gang...

Jeg har lidt problemer nemlig når jeg putter de ekstra på.
Dvs.
SELECT * FROM tabel1 LEFT JOIN tabel2 ON tabel1.id = tabel2.id
LEFT JOIN tabel3 ON tabel2.id = tabel3.id

Men jeg tror måske det her hjælper lidt på det.. Er lige ved at prøve at sætte en klausul på af gangen, så ser vi hvad der sker.
Avatar billede anhansen Nybegynder
05. april 2004 - 13:32 #4
kan du hurtigt forklare hvad forskellen er på LEFT JOIN og LEFT OUTER JOIN. Eller om der er nogen?
Avatar billede arne_v Ekspert
05. april 2004 - 13:49 #5
Avatar billede anhansen Nybegynder
05. april 2004 - 14:24 #6
Det virker ikke helt synes jeg... Jeg får lidt mindre når jeg putter alle mine left joins på... Selv om jeg betinger alt med OR NULL... Altså kun på de joinede tabeller selvfølgelig...
Avatar billede anhansen Nybegynder
05. april 2004 - 14:35 #7
Burde den ikke bare tage resultatet fra søgning uden left joins - og så putte ekstra på i de tilfælde der er noget at komme efter?
Avatar billede anhansen Nybegynder
05. april 2004 - 14:41 #8
Nu har jeg fundet problemet - det er når jeg betinger. F.eks
SELECT * FROM tabel1
LEFT JOIN tabel2 ON tabel1.id = tabel2.id
LEFT JOIN tabel3 ON tabel2.id = tabel3.id
WHERE
tabel3.Slettet IS NULL
AND (tabel3.ID = 8 OR tabel3.Id IS NULL)

Hvis så der findes en post hvor tabel3.id = 9 fx så kommer den ikke med - da tabel3.id selvfølgelig ikke er 9 eller null.
Hvordan kan man løse det?
Avatar billede arne_v Ekspert
05. april 2004 - 14:45 #9
Ikke forstået.

Du vil kun have records hvor tabel3.id er 8 eller der ikke er noget i tabel3.

Så kan det vel ikke overraske at records hvor tabel3.id er 9 ikke kommer med.
Avatar billede arne_v Ekspert
05. april 2004 - 14:46 #10
AND (tabel3.ID = 8 OR tabel2.ID = 9 OR tabel3.Id IS NULL)

måske
Avatar billede arne_v Ekspert
05. april 2004 - 14:46 #11
AND (tabel3.ID = 8 OR tabel3.ID = 9 OR tabel3.Id IS NULL)
Avatar billede anhansen Nybegynder
05. april 2004 - 15:02 #12
Nej... men problemet er at jeg gerne vil have alle records fra tabel1 med. Så vil jeg gerne se værdien af nogele felter fra dem som har værdien 8 i tabel3.id.

Det kan godt være jeg er ude hvor det ikke kan lade sig gøre - men du har ret i at det ikke bør komme bag på mig det andet - spørgsmålet var mere om det kunne lade sig gøre at få det med alligevel - altå indholdet fra tabel1.

Men nu har jeg bare taget alt fra tabel3 med.. Så kan vi sortere udtrækket i excel e.lign bagefter... :-)
Avatar billede anhansen Nybegynder
05. april 2004 - 15:06 #13
Problemet er vel når jeg begyndet at betinge på de tabeller jeg har left joined.. SÅ kan jeg ikke længere få dem alle med da nogle ikke vil falde ind for betingelsen.

Kunne jeg måske lave min left join som:
LEFT JOIN tabel3 ON tabel3.ID = 8
Hvordan ville det virke?
Avatar billede anhansen Nybegynder
05. april 2004 - 15:08 #14
glem det... det virker vist ikke.. .ER vist ved at rode lidt rundt i hovedet nu.. ;-)
Så ville jeg pludselig få kryds joins og få en masse flere poster...
Avatar billede anhansen Nybegynder
05. april 2004 - 15:17 #15
Men problemet er lidt at det jeg gerne vil have er et resultat hvor jeg har 4 kolonner til sidst med hver deres status for tabel3. Altså sådan ca sådan her:
tabel1.id | tabel2.id | tabel3.værdi (hvor id = 8) |tabel3.værdi (hvor id=9) | tabel3.værdi (hvor id=10)

Derfor vil jeg gerne betinge på tabel3.id = 8 eller null - men alle andre poster med værdi <> 8 skal fremgå som null... Kan du gennemskue det?
Avatar billede anhansen Nybegynder
05. april 2004 - 15:25 #16
altså: findes der en måde at sige "hvis !=8 så return null"
Avatar billede arne_v Ekspert
05. april 2004 - 15:35 #17
Det lyder som at du skal lave en self join på 3 kopier af tabel3 og så have
en where betingelse for hver af de 3 kopier.
Avatar billede anhansen Nybegynder
05. april 2004 - 15:37 #18
Hvad går en self join ud på? Det skal jo være for poster der er tilknyttet tabel1 med en reference stadig - dem der har en reference jo.
Avatar billede anhansen Nybegynder
05. april 2004 - 15:47 #19
Min plan var at lave 3 left joins med forskellige navne "LEFT JOIN tabel3 ON tba.. AS forste" osv.. Og så betinge dem, men jeg får stadig det problem at jeg ikke kan betinge på id=8 pga ovenstående...
Avatar billede arne_v Ekspert
05. april 2004 - 15:50 #20
LEFT JOIN tabel3 AS tabel3_1 ON tabel1.ID=tabel3_1.ID
LEFT JOIN tabel3 AS tabel3_2 ON tabel1.ID=tabel3_2.ID
LEFT JOIN tabel3 AS tabel3_3 ON tabel1.ID=tabel3_3.ID

WHERE tabel3_1.værdi=8 AND tabel3_2.værdi=9 AND tabel3.værdi=10
Avatar billede arne_v Ekspert
05. april 2004 - 15:50 #21
_3 i den sidste
Avatar billede anhansen Nybegynder
06. april 2004 - 07:54 #22
jeg tror det er vejen frem... Smid et svar så får du point.

Mange tak for hjælpen - og for at bringe overblik over en lille bid mere af sql'ens verden.. :-)
Avatar billede arne_v Ekspert
06. april 2004 - 07:59 #23
svar
Avatar billede anhansen Nybegynder
06. april 2004 - 10:31 #24
accepteret...
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
Computerworld tilbyder specialiserede kurser i database-management

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