[SQL] uniek record na een join

Pagina: 1
Acties:

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 21-08 08:11
Hoi mensen,

In SQL doe ik een join tussen 2 tabellen, een record in de 1e tabel heeft altijd 2 gerelateerde records in de 2e tabel.

Query:
SELECT tblPRODUCT.PRODUCT_ID, tblIMAGE.IMAGE_ID
FROM tblPRODUCT LEFT JOIN tblIMAGE ON tblPRODUCT.PRODUCT_ID = tblIMAGE.PRODUCT_ID;

Deze query laat dus een lijst zien van producten en gerelateerde images die bij dit product horen (op dit moment standaard 2 images in tblIMAGE)

probleem: elke product_id laat hij nu 2x zien omdat er 2 gerelateerde records zijn in tblIMAGE.

Hoe zorg ik er voor dat ik een lijst krijg van al mijn producten maar daarbij maar 1 IMAGE_ID laat zien. Maakt me niet uit of dit de 1e of 2e image_id is.

Ik heb gekeken naar een Group By, maar dit werkt niet als ik ook het IMAGE_ID wil laten zien in het resultaat, Access begint dan te zeuren.

Iemand een idee?

  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

Ja.
Het statement "DISTINCT" laat maar 1 rij zien.
Alleen, nu ik dit neerzet, vraag ik me af of
"SELECT DISTINCT VELD1, VELD2" niet ook alle image_id's laat zien, omdat die combinatie van die 2 velden uniek is.

[ Voor 255% gewijzigd door Brothar op 11-09-2003 23:39 ]

eagle


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Grapjas... heb je ook ontopic commentaar?
edit:
: Ah, na je edit wel dus ;)


Anyway... als het niet uitmaakt om welk id het gaat, kijk dan eens naar de MIN() of MAX() functie i.c.m. met de groupby. Dan pak je dus van elk produkt het plaatje met het laagste (of hoogste) ID. De groupby geld dan voor alle andere velden die je wilt tonen in je query.

[ Voor 5% gewijzigd door Creepy op 11-09-2003 23:18 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 21-08 08:11
die distinct werkt inderdaad niet omdat er toch steeds unieke combinaties ontstaan.

moet ik die min() / max() dus op een of andere manier loslaten op die IMAGE_ID?

Ik ben nooit zo handig geweest met de Group By clausule...

ik heb al Group By geprobeerd, maar dit kreeg ik bij een join alleen voor elkaar als ik alleen velden van 1 table in het resultaat laat zien. Als ik zowel PRODUCT_ID uit tblPRODUCT alswel IMAGE_ID uit tblIMAGE in het resultaat wil hebben, kreeg ik van Access een foutmelding iets over een "aggregate function".

ik ga ff puzzelen, maar als iemand weet hoe het precies in elkaar steekt hoor ik het graag:)

  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

(Even, ook voor Hylke: Na het "Ja", te hebben gepost, ben ik het gaat aanvullen - tijdens de volgende reacties.
Ik gaf dus eerst antwoord op de gestelde vraag "wie". De impliciete vraag "hoe" heb ik naderhand ook proberen te beantwoorden.
Oké, ik heb wel even plagerig lang gewacht met posten van de edit. :) Maar afzeiken doe ik niet. Nooit. En dus ook geen onzin-posts. Het enige wat ik altijd heb willen doen (en dat zal wel zo blijven), is helpen.)

Ik heb intussen mijn oude cursus SQL doorgebladerd, en kan zo snel niets verzinnen. Wat ik in eerste instantie had bedacht blijkt niet te kunnen.
Ik denk nu in de richting van een "Where"-statement, waarin een subquery komt, en die kijkt naar de MIN (of MAX) van het image_id, bij een gegeven artikel id.

Zoiets dus (ik kan dit niet testen in Access, en mijn Cursus is lang geleden, maar..is dit iets ?):
Select artikelen.art_id, images1.image_id
from artikelen, images1
where artikelen.art_id=images1.art_id AND
images1.image_id IN (Select Max(image_id), art_id
From images2
where images2.art_id=artikelen.art_id)

Door die subquery wordt dan maar 1 plaatje gekozen, wat je aantal rijen per artikel tot 1 terugbrengt.

[ Voor 107% gewijzigd door Brothar op 12-09-2003 00:40 ]

eagle


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

(offtopic)
Brothar schreef op 11 september 2003 @ 23:49:
(Even, ook voor Hylke: Na het "Ja", te hebben gepost, ben ik het gaat aanvullen - tijdens de volgende reacties.
Ik gaf dus eerst antwoord op de gestelde vraag "wie". De impliciete vraag "hoe" heb ik naderhand ook proberen te beantwoorden)
Als je dat nou gewoon in een keer doet, dan voorkom je misverstanden.
Hylke (moto-moi) verstuurde het bericht overigens omdat ik gevraagd heb dat te doen, ik heb namelijk geen rechten om dat te doen :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 21-08 08:11
Select artikelen.art_id, images1.image_id
from artikelen, images1
where artikelen.art_id=images1.art_id AND
images1.image_id IN (Select Max(image_id), art_id
From images2
where images2.art_id=artikelen.art_id)
waarom gebruik je hierin een keer images2 als table??

met jou voorbeeld heb ik dit in elkaar geknutseld en het werkt:
code:
1
2
3
4
5
6
SELECT tblPRODUCT.PRODUCT_ID, tblPRODUCT.PRODUCT_NAAM, tblIMAGE.IMAGE_ID, tblPRODUCT.GROEP_ID
FROM tblPRODUCT, tblIMAGE
WHERE (((tblPRODUCT.PRODUCT_ID)=[tblIMAGE].[PRODUCT_ID]) AND ((tblIMAGE.IMAGE_ID) In (Select Max(IMAGE_ID)
From tblIMAGE
where tblIMAGE.PRODUCT_ID=tblPRODUCT.PRODUCT_ID)) AND ((tblPRODUCT.GROEP_ID)=[geef id]))
ORDER BY tblPRODUCT.PRODUCT_NAAM;


in ieder geval bedankt!
Pagina: 1