[SQL] Inhoud twee tabellen vergelijken

Pagina: 1
Acties:

Onderwerpen


  • MrPepper
  • Registratie: Februari 2009
  • Laatst online: 23:14
Hoi tweakers,

Ik zit met het volgende SQL probleemstuk waar ik al een tijdje mee zit te klooien.

Ik heb een tabel, de tabel verkopen. Hier staan alle verkopen en klantenid's van een bedrijf in. Nu heeft klant 3 product A, B en C gekocht. Ik zoek een query waarmee ik alle klanten krijg te zien die ten minste dezelfde artikelen hebben gekocht. Ik heb tot zover het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
DROP VIEW IF EXISTS k3;

CREATE VIEW k3 AS
SELECT art
FROM verkoop
WHERE klant = 3;

SELECT klant.klant
FROM verkoop, klant
WHERE klant.klant = verkoop.klant
AND verkoop.klant <> 3
WHERE EXISTS (SELECT art FROM k3 where art in (SELECT art FROM klant);


Het probleem is echter dat dit alleen werkt als klant 3, slechts 1 artikel heeft.

Wie kan mij op weg helpen?

Als het gemakkelijk was had iemand anders het wel gedaan!


Verwijderd

Hoi MrPepper,

Je laatste deel moet je veranderen zodat je eigenlijk het volgende gaat doen :
  1. Eerst ga je het aantal producten opzoeken van de klant waarmee je wil vergelijken
  2. Ten tweede ga ja het aantal producten opzoeken dat overeenkomt met deze van de huidige klant
  3. Als het aantal producten overeenkomt, dan betekent dit dat ze minstens dezelfde producten hebben
Hiervoor zou je volgend stukje SQL kunnen gebruiken :

code:
1
2
3
4
5
SELECT DISTINCT(k.id)
FROM verkoop v, klant k
WHERE k.id = v.klant
AND v.klant <> 3
AND (SELECT COUNT(*) FROM verkoop v2 WHERE v2.klant = 3) = (SELECT COUNT(*) FROM verkoop v3 WHERE v3.klant = v.klant AND v3.product IN (SELECT * FROM k3));

  • MrPepper
  • Registratie: Februari 2009
  • Laatst online: 23:14
Bedankt voor je hulp, toch frustrerend om te zien hoe iemand het juiste antwoord zo uit zijn mouw schud terwijl je er zelf enorm lang mee zit te klooien. Thanks!

Als het gemakkelijk was had iemand anders het wel gedaan!


  • pedorus
  • Registratie: Januari 2008
  • Niet online
De 'normale methode' voor dit probleem is overigens een dubbele ontkenning, als in: Er is GEEN product waarvoor geld dat klant 3 dit heeft gekocht, en de terug te geven klant dit NIET heeft gekocht. (Theoretisch gezien komt dit omdat de 'voor alle'-operator uit tuple relational calculus niet bestaat in sql.)

Je krijgt dan dus:
SQL:
1
2
3
select klant.klant from klant where klant.id <> 3 and not exists 
    (select * from verkoop where verkoop.klantId = 3 and not exists 
    (select * from verkoop v2 where v2.klantId = klant.id and v2.art = verkoop.art))


Met de methode met counts in het andere antwoord moet je er wellicht ook rekening mee houden dat hetzelfde product meerdere keren is verkocht aan dezelfde klant. Stel de te zoeken klant besteld product A, B, en C 1 keer. Dan wordt een klant die product A 1 keer heeft besteld, product B 2 keer, en product C 0 keer onterecht teruggegeven. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

pedorus schreef op donderdag 29 november 2012 @ 19:06:
De 'normale methode' voor dit probleem is overigens een dubbele ontkenning, als in: Er is GEEN product waarvoor geld dat klant 3 dit heeft gekocht, en de terug te geven klant dit NIET heeft gekocht. (Theoretisch gezien komt dit omdat de 'voor alle'-operator uit tuple relational calculus niet bestaat in sql.)

Je krijgt dan dus:
SQL:
1
2
3
select klant.klant from klant where klant.id <> 3 and not exists 
    (select * from verkoop where verkoop.klantId = 3 and not exists 
    (select * from verkoop v2 where v2.klantId = klant.id and v2.art = verkoop.art))


Met de methode met counts in het andere antwoord moet je er wellicht ook rekening mee houden dat hetzelfde product meerdere keren is verkocht aan dezelfde klant. Stel de te zoeken klant besteld product A, B, en C 1 keer. Dan wordt een klant die product A 1 keer heeft besteld, product B 2 keer, en product C 0 keer onterecht teruggegeven. ;)
Daar heb je volledig gelijk in, maar omdat hij gewoon "artikelen" zei, dacht ik ook dezelfde hoeveelheid :) Daarom ben ik voor de count gegaan :)