Avatar billede oasen Nybegynder
27. april 2003 - 17:33 Der er 23 kommentarer og
2 løsninger

Join af tabeller

Jeg sidder og funderer lidt over, hvordan jeg løser følgende problem med ét SQL-statement.
Jeg giver 100 points for en løsning.

__Tabel1_______________________Tabel2
ID1___ID2_____________________ID2___ID3


Jeg skal have trukket ALLE poster ud af Tabel1 og joinet ID2 på tværs af tabellerne. Intet problem:

Select Tabel1.ID1, Tabel1.ID2 From Tabel1 Left Join Tabel2 On Tabel1.ID2 = Tabel2.ID2

Men jeg er nødt til at have puttet en Where-clause ind i join-operationen, således at ALLE poster i Tabel2, hvor ID3 ikke er lig med fx. 8 filtreres fra.

Gør jeg det, filtrerer jeg samtidig også nogle af posterne i Tabel1 fra, hvilket ikke må ske.

Idéen med det hele er, at jeg kan løbe Tabel1 helt i gennem og for hver post deri spørge, om der findes en relateret post i Tabel2, hvor ID3 = 8.
Er der ikke det, vil den ikke-eksistrende post jo returnere Null.
Avatar billede Slettet bruger
27. april 2003 - 18:13 #1
Hvad med:
Select Tabel1.ID1, Tabel1.ID2 From Tabel1 Left Join Tabel2 On Tabel1.ID2 = Tabel2.ID2 and Tabel2.id3 <> 8
Avatar billede Slettet bruger
27. april 2003 - 18:14 #2
Skulle være Tabel2-id3 = 8 selvfølgelig
Avatar billede oasen Nybegynder
27. april 2003 - 18:14 #3
Nej, jeg skal jo netop have returneret alle poster fra Tabel2, hvor ID3 = 8.
Avatar billede oasen Nybegynder
27. april 2003 - 18:16 #4
Går heller ikke, får så for jeg ikke alle poster ud fra Tabel1, hvis der ikke findes en tilsvarende post med ID2-værdien i Tabel2.
Avatar billede Slettet bruger
27. april 2003 - 18:19 #5
Select Tabel1-id1, tabel2.id2 from tabel1 where tabel1.id2=(select tabel2.id2 where tabel2.id3=8)
Avatar billede hossein Nybegynder
27. april 2003 - 18:19 #6
Hvad med:
Select Tabel1.ID1, Tabel1.ID2 From Tabel1, Tabel2 where Tabel1.ID2 = Tabel2.ID2 and Tabel2.ID3=8
Avatar billede Slettet bruger
27. april 2003 - 18:20 #7
Jamen hvis du skal have alle poster fra tabel1 hvad er så meningen med at bruge tabel2?
Avatar billede oasen Nybegynder
27. april 2003 - 18:32 #8
Ja, det er muligt, du er inde på noget af det rigtige der, hossein, men så skal der vist også en group by på.

bertie --> Meningen er, at jeg skal kunne tjekke for relaterede poster i Tabel2, mens jeg spoler recordsættet igennem. Jeg skal ikke bruge nogle deciderede oplysninger fra Tabel2, da den kun rummer to kolonner med fremmednøgler. Det her kunne blive en meget lang historie, men kort sagt skal jeg blot tjekke på eksistensen af udvalgte fremmednøgler, mens jeg løber de primære igennem.
Avatar billede Slettet bruger
27. april 2003 - 18:36 #9
Tja måske du skal have fat i noget outer join, prøv evt med:
Select Tabel1.ID1, Tabel1.ID2 From Tabel1 Left Outer Join Tabel2 On Tabel1.ID2 = Tabel2.ID2 and Tabel2.id3 = 8
Avatar billede oasen Nybegynder
27. april 2003 - 18:37 #10
hossein ---> Der var jeg vist lidt for hurtig. Din SQL giver mig jo kun poster fra Tabel1, hvis der findes relaterede i Tabel2, og altså ikke dem alle i Tabel1...
Avatar billede hossein Nybegynder
27. april 2003 - 19:14 #11
Er det MySQL?
Avatar billede oasen Nybegynder
27. april 2003 - 19:16 #12
Det er til et forum, der både skal køre med MySQL, Access og muligvis MS SQL.
Avatar billede oasen Nybegynder
27. april 2003 - 19:17 #13
Altså ikke samtidig forstås ;o)
Avatar billede hossein Nybegynder
27. april 2003 - 19:21 #14
MySQL og MSAccess understøtter ikke FK. Så er det Oracle og msSQL også de kraftige. Også hvis det er FK du er ude efter.
Avatar billede oasen Nybegynder
27. april 2003 - 19:32 #15
I know, men det burde da kunne laves...

Alternativt kan man selvfølgelig oprette en ny tabel på basis af Tabel2 indeholdende de filtrerede poster. Men det er måske lidt overkill..
Avatar billede Slettet bruger
27. april 2003 - 19:37 #16
Alternativt kunen du jo poste i den database gruppe som du gerne vil lave dette i og se om der ikke er nogen hjælp at hente der :-)
Avatar billede hossein Nybegynder
27. april 2003 - 19:39 #17
Ja, oprettelse af en temp tabel er god nok. Ellers kan du lave flere RS.
Avatar billede oasen Nybegynder
27. april 2003 - 21:23 #18
Ja, jeg ved helt ærligt bare ikke, om det vil være i overkanten med Access at oprette midlertidige tabeller.

Eksperten gør jo det samme til beregning af placering, men det er også en noget kraftigere database. Hvad siger I?
Avatar billede jesperfj Nybegynder
28. april 2003 - 09:58 #19
Jeg mener det er en generel egenskab ved SQL at man ikke umiddelbart kan lave et betinget left join. Dog kan man komme igennem uden en fysisk temp tabel, i det man på forespørgselstidspunktet kan oprette en virtuel temptabel som man så skal navngive. Se eksemplet nedenunder som jeg har testet i Access.

Mvh. Jesper

SELECT Table1.Name, Table1.Id, Table2.Id3 AS Expr1
FROM Table1 LEFT JOIN [SELECT * FROM Table2 WHERE ID3 = 8]. AS QTable2 ON Table1.Id = QTable2.Id2;
Avatar billede oasen Nybegynder
28. april 2003 - 12:01 #20
Den havde jeg ikke lige tænkt på. Det kunne være, det er vejen frem.
Jeg skriver lidt senere ;)
Avatar billede burningice Nybegynder
28. april 2003 - 13:31 #21
hvorfor er det egentlig at dette spm ligger i asp-kategorien ? det har jo intet med asp at gøre, burde nok hellere ligge i en sql-kategori.
Avatar billede oasen Nybegynder
28. april 2003 - 20:04 #22
Nej, det har ikke en dyt med ASP at gøre, men så vidt jeg ved, er der ingen SQL-kategori. Eller er der...?

Jeg kunne selvfølgelig også have lagt den i "databaser generelt", men jeg er overbevist om, at de bedste svar fås her.
Avatar billede Slettet bruger
28. april 2003 - 20:08 #23
Der er databasekategorier til MS SQL ihvertfald og jeg tror at du vil få bedre svar der end her :-)
Avatar billede oasen Nybegynder
28. april 2003 - 22:23 #24
Det kan ellers dårligt blive bedre end det, jesperfj kom med :=)
Avatar billede oasen Nybegynder
28. april 2003 - 22:29 #25
Tak for deltagelsen!

jesperfj -> Tillykke med dine første points :o)
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
Kurser inden for grundlæggende programmering

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