Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Begynderproblemer med JOIN

9 views
Skip to first unread message

Jens

unread,
Jan 9, 2014, 5:07:08 PM1/9/14
to
Jeg har 2 problemer med JOIN, hvor jeg ikke kan få skrevet den korrekte syntaks. Håber på hjælp her.
Jeg har en hjemmeside med vine, vingårde og druer. Vinene er listet i tabellen ’varekatalog’ og vingårdene er listet i tabel ’vingaarde’ og endelig druenavne og deres synonymer er listet i tabellen ’druer’

Eksempel

Tabel varekatalog
Vinnavn Vingaard Druetype1 Druetype2 …. Druetype7
Okseblod 3 1 4 5
præstetanker 45 28 4
Den med tyren 56 3 7 3

Tabel vingaarde
id Vingaardnavn
1 Den lille farm
2 Chateaux Haux

Tabel druer
id druenavn
1 Merlot
2 Cabernet Sauvignon

Problem 1: jeg skal fra Tabel ’Varekatalog’ joine til både tabel ’vingaarde’ og tabel ’druer’.
Den første join til ’vingaarde’ virker fint med
strSQL1 = "Select * from Varekatalog (LEFT OUTER JOIN vingaarde on Varekatalog.vingaard=vingaarde.id) WHERE udsolgt=FALSE order by varenr"
Nu skal jeg så også joine til tabel ’druer’, hvor varekatalog.druetype1 refererer til druer.druenavn. Hvis nu jeg ikke havde den første Join ovenfor kunne jeg skrive
strSQL2 = "Select * from Varekatalog (LEFT OUTER JOIN druer on Varekatalog.druetype1=druer.id) WHERE udsolgt=FALSE order by varenr"
men nu skal de kombineres i én sql-sætning, og hvordan gør jeg det? Skal de 2 parenteser sidestilles med AND eller med komma eller med mellemrum ?? Altså
strSQL = ”Select * from varekatalog (parentes1) and (parentes2) where ….. eller en helt anden syntax?

Problem 2: Jeg har ikke ét felt i tabel ’varekatalog’ som joiner til druer – jeg har 7 felter, da en vin jo kan indeholde mange druer. Jeg har altså i tabellen Varekatalog felterne druetype1, druetype2, … druetype7 – og de skal alle joines til tabel druer. Jeg har gættet på at jeg blot i ”on”-sætningen skal skrive
on Varekatalog.druetype1=druer.id, Varekatalog.druetype2=druer.id, … Varekatalog.druetype7=druer.id
Er det rigtigt med komma mellem de 7? Eller skal det være en anden syntaks?
Når jeg nu i min asp-kode skal hente druenavne, som står i feltet druenavn i tabellen druer, hvad gør jeg så? Hvis vi begrænser til at jeg gerne vil hente indholdet af druetype2 pe6, så er det jo ikke nok at skrive rs(”druenavn”) – jeg må jo på en eller anden måde indikere at det er druenavnet fra reference druetype2! Kan jeg skrive rs(”druetype2.druenavn”) eller rs(”druenavn.druetype2”) eller …?

Eller er der en helt nemmere løsning end join ?
Mvh.
Jens

Leif Neland

unread,
Jan 9, 2014, 6:06:02 PM1/9/14
to
select ...
from tabel_a
left outer join tabel_b on tabel_a.felt_1=tabel_b.felt_1
left outer join tabel_c on tabel_a.felt_2=tabel_c.felt_2
where ...
>
> Problem 2: Jeg har ikke ét felt i tabel ’varekatalog’ som joiner til druer –
> jeg har 7 felter, da en vin jo kan indeholde mange druer. Jeg har altså i
> tabellen Varekatalog felterne druetype1, druetype2, … druetype7 – og de skal
> alle joines til tabel druer. Jeg har gættet på at jeg blot i ”on”-sætningen
> skal skrive on Varekatalog.druetype1=druer.id,
> Varekatalog.druetype2=druer.id, … Varekatalog.druetype7=druer.id Er det
> rigtigt med komma mellem de 7? Eller skal det være en anden syntaks? Når jeg
> nu i min asp-kode skal hente druenavne, som står i feltet druenavn i tabellen
> druer, hvad gør jeg så? Hvis vi begrænser til at jeg gerne vil hente
> indholdet af druetype2 pe6, så er det jo ikke nok at skrive rs(”druenavn”) –
> jeg må jo på en eller anden måde indikere at det er druenavnet fra reference
> druetype2! Kan jeg skrive rs(”druetype2.druenavn”) eller
> rs(”druenavn.druetype2”) eller …?

Du burde have en mange-til-mange relation mellem vin og druetype.
En tabel med (mindst) to felter: vin_id og drue_id

Uden at sætte mig ind i dine felt/tabel-navne:

select vin.navn, drue.navn from vin
inner join vin_drue on vin.id=vin_drue.vin_id
inner join drue on vin_drue.drue_id=drue.id

Du kan så vælge alle vine med en bestemt drue, eller alle druer i en
bestemt vin.

vin_drue kunne have et felt til at angive %-delen af druen i vinen.

Leif

--
Husk kørelys bagpå, hvis din bilfabrikant har taget den idiotiske
beslutning at undlade det.


Leif Neland

unread,
Jan 9, 2014, 6:11:59 PM1/9/14
to
Efter mange tanker skrev Jens:

> Problem 2: Jeg har ikke ét felt i tabel ’varekatalog’ som joiner til druer –
> jeg har 7 felter, da en vin jo kan indeholde mange druer. Jeg har altså i
> tabellen Varekatalog felterne druetype1, druetype2, … druetype7 –

Du kan lave vin_drue tabellen med, evt i hånden at køre

insert into vin_drue (vin_id,drue_id)
select id,druetype1 from varekatalog
where druetype1 is not null and druetype1>0;

insert into vin_drue (vin_id,drue_id)
select id,druetype2 from varekatalog
where druetype2 is not null and druetype2>0;

og så videre med druetype3-7

Du kan tilpasse where efter hvad der er i feltet, når det er tomt.

Jens

unread,
Jan 10, 2014, 4:26:36 AM1/10/14
to
Tusind tal Leif for dit detaljerede svar.

Jeg forstår på dig, at der er ingen vej udenom. Jeg er nødt til at lave og vedligeholde en tabel (VIN_DRUE), der kombinerer de allerede eksisterende tabeller VIN og DRUE. Den bliver ret stor - øv - men det er så det.

Og så lige SELECT-sætningen igen. Du angiver de 2 INNER JOINs efter hinanden
som

SELECT ... FROM VIN
INNER JOIN VIN_DRUE ON ...
INNER JOIN DRUE ON ....
WHERE ...

men skal der ikke nogle parenteser, nogle kommaer eller nogle AND'er?
Umiddelbart ville jeg tro, at de skulle indlejres i hinanden. Og da jeg jo også har tabellen Vingaarde, troede jeg at der skulle stå

SELECT ... FROM ((VIN
INNER JOIN VIN_DRUE ON ...)
INNER JOIN DRUE ON ....)
INNER JOIN VINGAARDE ON ...
WHERE ...

Men det er måske forkert?

mvh.
/jens

Leif Neland

unread,
Jan 10, 2014, 5:28:57 PM1/10/14
to
Jens kom med denne ide:
> Tusind tal Leif for dit detaljerede svar.
>
> Jeg forstᅵr pᅵ dig, at der er ingen vej udenom. Jeg er nᅵdt til at lave og
> vedligeholde en tabel (VIN_DRUE), der kombinerer de allerede eksisterende
> tabeller VIN og DRUE. Den bliver ret stor - ᅵv - men det er sᅵ det.

Hvordan vil du vedligeholde data?

Jeg ville lave et webinterface, hvor man angiver druen i en rᅵkke
checkbokse eller en select, hvor man kan vᅵlge flere options.
>
> Og sᅵ lige SELECT-sᅵtningen igen. Du angiver de 2 INNER JOINs efter hinanden
> som
>
> SELECT ... FROM VIN
> INNER JOIN VIN_DRUE ON ...
> INNER JOIN DRUE ON ....
> WHERE ...
>
> men skal der ikke nogle parenteser, nogle kommaer eller nogle AND'er?
>

Trust me ;-) Det er ikke nᅵdvendigt med alle de paranteser.

> Umiddelbart ville jeg tro, at de skulle indlejres i hinanden. Og da jeg jo
> ogsᅵ har tabellen Vingaarde, troede jeg at der skulle stᅵ
>
> SELECT ... FROM ((VIN
> INNER JOIN VIN_DRUE ON ...)
> INNER JOIN DRUE ON ....)
> INNER JOIN VINGAARDE ON ...
> WHERE ...
>
> Men det er mᅵske forkert?
>
Det ser fornuftigt ud, og igen er det ikke nᅵdvendigt med parenteser.

Leif

--
Husk kᅵrelys bagpᅵ, hvis din bilfabrikant har taget den idiotiske
beslutning at undlade det.


Andreas Andersen

unread,
Jan 11, 2014, 5:06:21 AM1/11/14
to
Den 10-01-2014 23:28, Leif Neland skrev:
> Jens kom med denne ide:
>> SELECT ... FROM ((VIN
>> INNER JOIN VIN_DRUE ON ...)
>> INNER JOIN DRUE ON ....)
>> INNER JOIN VINGAARDE ON ...
>> WHERE ...
>>
>> Men det er mᅵske forkert?
>>
> Det ser fornuftigt ud, og igen er det ikke nᅵdvendigt med parenteser.

Hvis det er en Access-database, slipper man vist ikke for parenteserne.

--
Andreas

Jens

unread,
Jan 11, 2014, 3:42:59 PM1/11/14
to
Der ER en access database :-)

mvh.
/jens

J�rn Andersen

unread,
Jan 12, 2014, 3:59:05 AM1/12/14
to
On Sat, 11 Jan 2014 12:42:59 -0800 (PST), Jens
<jens.r.ra...@gmail.com> wrote:

>Der ER en access database :-)

Hvis det er en access database, s� brug foresp�rgsels-design. N�r du
har den foresp�rgsel, du vil have, s� skift til SQL-visning og kopi�r
SQL'en til din ASP - og stud�r resultatet.

Som regel skal der lige rettes nogle enkelte anf�rselstegn el. lign.,
men du (ligesom jeg) ikke er gode venner med komplekse joins, s�
sparer du ret meget tid med at b�vle med med.

Via et grafisk interface hiver du de tabeller ind, du skal bruge, og:
- joiner de felter, der skal h�nge sammen ved at tr�kke et felt til
dens makker i den anden tabel
- dobbeltklikker p� join-linjen for at v�lge join-type
- v�lger de felter, der skal vises
- checker resultatet ved at k�re foresp�rgslen

Er det ikke som �nsket, s� pr�v at rette et eller andet. Som regel
lykkes det :-)

Tilsvarende, hvis du har en selv-lavet SQL, der giver en
uigennemskuelig fejl, s� brug:
Reponse.Write strSql
Reponse.End
- og kopier SQL'en ind i en kopi af Access Db'en og k�r foresp�rgslen.
S� bliver det som regel �benlyst, hvad der er galt.

PS: Det er ikke alle joins, der kan emuleres i Query-Builderen, men
langt de fleste.

Good luck,
J�rn

--
J�rn Andersen
http://socialister.dk
http://marxisme.dk
0 new messages