Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[sql] Voorkom duplicaten bij meerdere criteria

Pagina: 1
Acties:

  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 17-11 07:32
Voor een zoekmachine/website (IIS / ASP / Access) is het uitgangspunt de tabel: tblBedrijf

Via de website kun je een gehele lijst oproepen van bedrijven, maar middels dropdownsboxen kun je je zoekresultaat verfijnen met verschillende criteria:
tblBEDRIJF_PROVINCIE -> criteria provincie
tblBEDRIJF_DOELGROEP -> criteria doelgroep
etc etc in totaal zijn er 5 criteria

Nu wil ik een universele query maken in access, die het mogelijk maakt om zowel een gehele lijst op te roepen, alswel een verfijnde selectie van de bedrijven.

Als ik deze query heb:
code:
1
2
SELECT tblBEDRIJF.BEDRIJF_ID, tblBEDRIJF.BEDRIJF_NAAM, tblBEDRIJF.BEDRIJF_PLAATS, tblBEDRIJF.BEDRIJF_ZOEK_OMSCHR
FROM ((((tblBEDRIJF LEFT JOIN tblBEDRIJF_ACTIVITEIT ON tblBEDRIJF.BEDRIJF_ID = tblBEDRIJF_ACTIVITEIT.BEDRIJF_ID) LEFT JOIN tblBEDRIJF_DOELGROEP ON tblBEDRIJF.BEDRIJF_ID = tblBEDRIJF_DOELGROEP.BEDRIJF_ID) LEFT JOIN tblBEDRIJF_PERSONEN ON tblBEDRIJF.BEDRIJF_ID = tblBEDRIJF_PERSONEN.BEDRIJF_ID) LEFT JOIN tblBEDRIJF_PRIJSKLASSE ON tblBEDRIJF.BEDRIJF_ID = tblBEDRIJF_PRIJSKLASSE.BEDRIJF_ID) LEFT JOIN tblBEDRIJF_PROVINCIE ON tblBEDRIJF.BEDRIJF_ID = tblBEDRIJF_PROVINCIE.BEDRIJF_ID;

dan leek het in eerste instantie goed te gaan; tot een bedrijf gekoppeld werd aan meerdere criteria van dezelfde categorie;
stel dat een bedrijf gekoppeld was aan zowel aan de provincie limburg en noordholland, dan komt die in het zoekresultaat ook dubbel voor als record.

Hoe kan ik dit voorkomen? (Een DISTINCT gaat volgens mij niet werken, omdat ik 5 verschillende criteria heb. En een GROUP BY ook niet)

(Als ik dit eenmaal goed voor elkaar heb, is niet meer zo moeilijk om de WHERE clause af te maken met in te vullen criteria)

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Probeer voor de grap eens een distinct voor je hem afserveert, volgens mij is dit precies wat je moet hebben.

Who is John Galt?


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Waarom doe je joins?

kan je niet zo iets doen

SQL:
1
2
3
4
5
SELECT    bedrijf.....
FROM     tblBedrijf bedrijf
WHERE    bedrijf.BEDRIJF_ID in (  SELECT activiteit.BEDRIJF_ID
                                  FROM tblBEDRIJF_ACTIVITEIT activiteit
                                  WHERE .... )

In je select selecteer je immers alleen gegevens uit de bedrijven tabel

[ Voor 10% gewijzigd door Woy op 06-05-2008 11:00 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Meekoh
  • Registratie: April 2005
  • Laatst online: 17-11 22:19
rwb schreef op dinsdag 06 mei 2008 @ 10:58:
Waarom doe je joins?

kan je niet zo iets doen

SQL:
1
2
3
4
5
SELECT    bedrijf.....
FROM     tblBedrijf bedrijf
WHERE    bedrijf.BEDRIJF_ID in (  SELECT activiteit.BEDRIJF_ID
                                  FROM tblBEDRIJF_ACTIVITEIT activiteit
                                  WHERE .... )

In je select selecteer je immers alleen gegevens uit de bedrijven tabel
omdat dat langzamer is dan een join ;)

edit: Weet niet of Access dat ondersteund, maar je kunt ook je joins zelf vernauwen met where clauses.

edit2: Voorbeeldje:
SQL:
1
2
3
4
5
   
SELECT b.*
FROM tblBedrijf b
INNER JOIN tblBEDRIJF_ACTIVITEIT ba on b.BedijfID = ba.BedrijfID
AND ba.Activiteit = 'je activiteit'


edit3: blijf bezig zo :P Maargoed hoe wil je met dropdownboxen meerdere provincies selecteren? Ervanuitgaand dat je 1 dropdownbox hebt met alle provincies.

[ Voor 29% gewijzigd door Meekoh op 06-05-2008 11:52 ]

Computer says no


  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 17-11 07:32
omdat in de admin van de website bepaald kan worden dat een bedrijf bij meerdere provincies kan horen. En ook dat een bedrijf bij meerdere activiteiten kan horen. In de dropdowns kan men natuurlijk maar een keuze gaan maken.

Maar juist als je geen keuze maakt in de dropdowns, dan gaat die alle records combineren.
(provincies is dan niet zo'n goed voorbeeld, want komt niet zo vaak voor. Maar activiteiten wel, want bedrijf exploiteert meerdere zaken)

Dan krijg je dus terug

bedrijf plaats activiteit
Paintball planet A'dam Paintball
Paintball planet A'dam Laserschieten

En ik wil dat er maar 1 keer het unieke bedrijf Painball planet naar voren komt!

Is die methode van de select in de where clause echt veel langzamer dan een join???

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Moshe85 schreef op dinsdag 06 mei 2008 @ 11:01:
[...]
omdat dat langzamer is dan een join ;)
Als je dat ook wilt onderbouwen met een bron. Zowiezo zal het nogal uithalen welk DBMS je gebruikt, een beetje DBMS optimaliseert toch al een hoop in het execution plan. Aangezien het een non-correlated sub-query is hoeft hij maar een maal voor de hele query uitgevoerd te worden en denk ik niet dat het langzamer als een join is. ( Maar nogmaals het ligt voornamenlijk aan de optimalisatie van de DBMS )
trekker22 schreef op dinsdag 06 mei 2008 @ 16:15:
omdat in de admin van de website bepaald kan worden dat een bedrijf bij meerdere provincies kan horen. En ook dat een bedrijf bij meerdere activiteiten kan horen. In de dropdowns kan men natuurlijk maar een keuze gaan maken.
Waarom zou dat niet kunnen met de (pseudo)query die ik geef?
trekker22 schreef op dinsdag 06 mei 2008 @ 16:15:
Is die methode van de select in de where clause echt veel langzamer dan een join???
Als het het juiste resultaat geeft, duidelijk is, en genoeg performance voor jouw doeleinden heeft is dat toch helemaal niet zo interessant als het al zo zou zijn?

[ Voor 29% gewijzigd door Woy op 06-05-2008 16:34 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:55

Janoz

Moderator Devschuur®

!litemod

trekker22 schreef op dinsdag 06 mei 2008 @ 16:15:
omdat in de admin van de website bepaald kan worden dat een bedrijf bij meerdere provincies kan horen. En ook dat een bedrijf bij meerdere activiteiten kan horen. In de dropdowns kan men natuurlijk maar een keuze gaan maken.

Maar juist als je geen keuze maakt in de dropdowns, dan gaat die alle records combineren.
(provincies is dan niet zo'n goed voorbeeld, want komt niet zo vaak voor. Maar activiteiten wel, want bedrijf exploiteert meerdere zaken)

Dan krijg je dus terug

bedrijf plaats activiteit
Paintball planet A'dam Paintball
Paintball planet A'dam Laserschieten

En ik wil dat er maar 1 keer het unieke bedrijf Painball planet naar voren komt!

Is die methode van de select in de where clause echt veel langzamer dan een join???
Als je de kolom activiteit weghaalt en een distinct toevoegd ben je toch klaar? Je zult sowieso het veld activiteit weg moeten halen. Dat zorgt er immers in dit geval voor dat de records verschillend zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Janoz schreef op dinsdag 06 mei 2008 @ 16:38:
[...]


Als je de kolom activiteit weghaalt en een distinct toevoegd ben je toch klaar? Je zult sowieso het veld activiteit weg moeten halen. Dat zorgt er immers in dit geval voor dat de records verschillend zijn.
In de query die hij in de openings post laat zien staat die ook niet, dus daar een distinct toevoegen zou het al oplossen.

Echter zoals de query in de op staat is het niet echt leesbaar ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • trekker22
  • Registratie: Maart 2003
  • Laatst online: 17-11 07:32
Ben er achter gekomen dat een DISTINCT wel voldoende is, mits ik er maar niks laat zien van die provincies / activiteiten / prijsklassen!

(Weet alleen niet zeker of ik dan wel voldoende info heb, maar daar komen we vanzelf wel achter!)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
trekker22 schreef op dinsdag 06 mei 2008 @ 17:24:
Ben er achter gekomen dat een DISTINCT wel voldoende is, mits ik er maar niks laat zien van die provincies / activiteiten / prijsklassen!

(Weet alleen niet zeker of ik dan wel voldoende info heb, maar daar komen we vanzelf wel achter!)
Maar als je wel dingen van provincies / activiteiten / prijsklassen wilt laten zien dan is het ook correct dat er meerdere rijen getoond worden!

[ Voor 3% gewijzigd door Woy op 06-05-2008 20:04 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1