Toon posts:

[SQL] Tegenovergestelde van een join

Pagina: 1
Acties:
  • 361 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb het vollgende sql statement die ik op mijn MySQL dbase wil loslaten, maar van alle gesprobeerd maar werkt niet.

SELECT klantnr, naam FROM Klanten WHERE Klanten.klantnr NOT IN (SELECT Klantprofiel.klantnummer FROM Klantprofiel, Klanten WHERE Klanten.klantnr = Klantprofiel.klantnummer)

(natuurlijk test ik dit in phpadmin en als werkt zet ik hetm (omgebouwd) in me php file)

Ik heb twee tabellen, een klanten tabel en een klantprofiel tabel. Nu wil ik alle klantnr van de klant tabel weergeven - alle klantnr die voorkomen in de klantprofiel tabel. Makelijk probleem lijkt me, maar op de een over andere manier werkt het niet.

Kan iemand mij helpen?

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 16:05

Dido

heforshe

Waarom zo moeilijk :?
code:
1
2
3
SELECT klantnr, naam
  FROM klanten
 WHERE klantnr NOT IN ( SELECT Klantnr FROM klantprofiel)

Zou het ook moeten doen?

Heb je alle klantnummers die niet in klantprofiel staan.

/edit: oh, verd^@&%^#!@, MySQL :|

[ Voor 30% gewijzigd door Dido op 19-03-2003 13:48 ]

Wat betekent mijn avatar?


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Het werkt niet....
Wat krijg je dan voor foutmelding ofzo?

Ah, ik zie dat je MySQL gebruikt, die ondersteunt nog altijd geen subqueries dacht ik. Anders is het wel op te lossen met een subquery.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Logisch dat deze constructie iig niet werkt. Je wilt een subquery gebruiken, en MySQL 4.1 alpha ondersteunt deze pas, geloof ik.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 03-02 15:29
Is dit niet wat je wilt:

code:
1
2
3
4
5
6
7
8
select 
  klantnr, 
  naam
from
  klanten,
  klantprofiel
where
  klanten.klantnr != klantprofiel.klantnummer

btw, best irri die nederlandse namen en waarom de ene tabel klantnr en de andere tabel klantnummer?

Ook Knor is aangestoken met het ligfietsvirus!


Verwijderd

Topicstarter
SELECT klantnr, naam FROM Klanten WHERE klantnr NOT IN ( SELECT Klantnummer FROM Klantprofiel )

Werkt niet en de foutmeldign die ik krijg is erug vaag (syntax error in regel 1, bla, bla)

Denk dat indd te maken heeft met die subquery. Dus hebben jullie enig idee hoe ik dat dan kan oplossen?

Verwijderd

Topicstarter
select
klantnr,
naam
from
klanten,
klantprofiel
where
klanten.klantnr != klantprofiel.klantnummer

Dit heb ik geprobeerd, en werkt als ik een klantprofiel heb aangemaakt, zo gauw het er meer worden, krijg ik een brei aan klantnummers, heel vaag

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Wat je wel kunt doen is een komma-separated string maken van de klantid's die je niet wilt zien, en dan die string gebruiken en je query:

code:
1
2
3
SELECT *
FROM klanten
WHERE klanten.klantId NOT IN ( 1, 2, 5, 50 )

bv.

Maar, op die manier heb je wel 2 queries nodig. (1x om alle klantid's op te halen, in je programma moet je dan een stuk code schrijven die die id's in een string gaat gaan zetten, separated door komma's, en dan nog eens een query die dan de klanten die je wel nodig hebt gaat gaan ophalen.


ps: gebruik ook de 'edit'-knop ipv meerdere post achter elkaar te doen.

[ Voor 7% gewijzigd door whoami op 19-03-2003 13:52 ]

https://fgheysels.github.io/


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 16:05

Dido

heforshe

Rotjeknor schreef op 19 March 2003 @ 13:49:
code:
1
2
3
4
5
6
7
8
select 
  klantnr, 
  naam
from
  klanten,
  klantprofiel
where
  klanten.klantnr != klantprofiel.klantnummer

Die is heel leuk :) Moet je voor de aardigheid eens gaan proberen, je krijgt dan voor iedere klant in klanten alle klanten in profielen behalve degen die erbij hoort... bíjna een cartesisch product :P

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Ja, maar goed, het moet dus dynamisch zijn. Een klant mag maar een keer een klantprofiel hebben. Maak ik dus een nieuw klantprofiel aan, dan mogen in het selectiemenu alleen de klanten staan die nog geen profiel hebben.

Verwijderd

code:
1
2
3
4
5
6
7
8
9
SELECT
   klant.klantnr,
   klant.naam
FROM 
   klant
      LEFT OUTER JOIN
         klantprofiel ON klant.nr = klantprofiel.klantnr
WHERE
   klantprofiel.klantprofielnr IS NULL

Dit geeft volgens mij hetzelfde resultaat als je eerste query in dit topic.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 16:05

Dido

heforshe

Dan zóu je voor iedere klant een standaard (leeg) profiel aan kunnen maken, dan heb je dat probleem ook niet meer.

Wat betekent mijn avatar?


Verwijderd

select
klantnr,
naam
from
klantprofiel KP
RIGHT OUTER JOIN klanten K ON K.klantnr = KP.klantnummer
where
KP.klantnummer IS NULL

Kan zijn dat ik de JOIN omdraai maar je snapt denk ik wel wat ik bedoel.

edit:

ai te lang aan het typelen men was mij voor.....

[ Voor 13% gewijzigd door Verwijderd op 19-03-2003 13:58 ]


Verwijderd

Dido schreef op 19 March 2003 @ 13:56:
Dan zóu je voor iedere klant een standaard (leeg) profiel aan kunnen maken, dan heb je dat probleem ook niet meer.

MAW, het zou in één tabel kunnen :)

Verwijderd

Topicstarter
SELECT
klant.klantnr,
klant.naam
FROM
klant
LEFT OUTER JOIN
klantprofiel ON klant.nr = klantprofiel.klantnr
WHERE
klantprofiel.klantprofielnr IS NULL

werkt prima! bedankt! Tweakers rulles dat blijkt wel weer!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 16:05

Dido

heforshe

Verwijderd schreef op 19 March 2003 @ 13:58:
MAW, het zou in één tabel kunnen :)

Onder het motto KISS, de oplossing ligt in het databaseontwerp, niet in de applicatie :)

Wat betekent mijn avatar?


Verwijderd

Dido schreef op 19 March 2003 @ 14:00:

[...]

Onder het motto KISS, de oplossing ligt in het databaseontwerp, niet in de applicatie :)
KISS ooit gehad en ook Niam maar met gezond verstand en een ERD kom je net zo ver maar dan een stuk sneller....

Verwijderd

Verwijderd schreef op 19 March 2003 @ 13:58:

[...]

MAW, het zou in één tabel kunnen :)
nee, dat is niet hetzelfde. Stel een profiel bevat 30 velden, dan zou in de situatie met 1 tabel voor elke klant zonder profiel 30 lege velden aanwezig zijn. Bij een tweede tabel (waarbij 1 default record voor 'leeg') komen er maximaal 30 lege velden voor, omdat je maar 1 leeg record hoeft te hebben.

Bovenstaande methode is ook beter voor je performance, je hoeft geen outer joins te gebruiken..

dus: 1 'leeg' profiel maken, en dat koppelen aan alle klanten zonder profiel..

  • 0siris
  • Registratie: Augustus 2000
  • Laatst online: 22-08 17:19
...huiswerk ook weer af! ;)
Ik zal dit even verduidelijken voor de moderator:
Ik zie dat topicstarter bedrijfskundige informatica doet. Daar krijg je SQL, lijkt me nogal dat dit een huiswerkvraag was. Maar als jij dit bericht perse wil deleten, be my guest...

[ Voor 82% gewijzigd door 0siris op 20-03-2003 08:49 ]

ach...in een volgend leven lach je er om!


  • momania
  • Registratie: Mei 2000
  • Laatst online: 17:50

momania

iPhone 30! Bam!

Verwijderd schreef op 19 maart 2003 @ 14:01:
[...]


nee, dat is niet hetzelfde. Stel een profiel bevat 30 velden, dan zou in de situatie met 1 tabel voor elke klant zonder profiel 30 lege velden aanwezig zijn. Bij een tweede tabel (waarbij 1 default record voor 'leeg') komen er maximaal 30 lege velden voor, omdat je maar 1 leeg record hoeft te hebben.

Bovenstaande methode is ook beter voor je performance, je hoeft geen outer joins te gebruiken..

dus: 1 'leeg' profiel maken, en dat koppelen aan alle klanten zonder profiel..
Beter is het profielid op te nemen in de klant ipv de klantid in het profiel....
Je hebt (als het goed is) wel klanten zonder profiel, maar nooit profielen zonder klanten...

[edit]
Daarbij komt als extra voordeel dat je voor het zoeken naar klanten zonder profiel, je maar 1 table hoeft aan te spreken...

[ Voor 12% gewijzigd door momania op 19-03-2003 14:05 ]

Neem je whisky mee, is het te weinig... *zucht*


Verwijderd

Verwijderd schreef op 19 maart 2003 @ 14:01:
nee, dat is niet hetzelfde. Stel een profiel bevat 30 velden, dan zou in de situatie met 1 tabel voor elke klant zonder profiel 30 lege velden aanwezig zijn. Bij een tweede tabel (waarbij 1 default record voor 'leeg') komen er maximaal 30 lege velden voor, omdat je maar 1 leeg record hoeft te hebben.

Bovenstaande methode is ook beter voor je performance, je hoeft geen outer joins te gebruiken..

dus: 1 'leeg' profiel maken, en dat koppelen aan alle klanten zonder profiel..

Je zou gelijk kunnen hebben, en dat is als er doorgaans veel klanten zonder profiel zijn. Ik ken niet de exacte inhoud van zo'n profiel van gegevens, en kaan daar dus verder weinig over zeggen.

Maar als vrijwel iedere klant een profiel heeft, dan zou het beter in één tabel kunnen lijkt me. Een 1 op 1 relatie overhouden na het normaliseren, zou dus minimaal moeten betekenen dat klantprofiel een zwakke entiteit is.

Al met al denk ik dat we te weinig details kennen om een definitief oordeel te vellen ;)

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 16:05

Dido

heforshe

Verwijderd schreef op 19 maart 2003 @ 14:01:
KISS ooit gehad en ook Niam maar met gezond verstand en een ERD kom je net zo ver maar dan een stuk sneller....

Ik bedoelde eigenlijk gewoon Keep It Simple, Stupid. Gezond verstand is daar het belangrijkste onderdeel van :P

En ik doelde eigenlijk ook op een 1-1 relatie; als je, zoals opgemerkt het profielID opneemt in je klanttabel kun je dat NULL laten als er geen profiel is en zo selecteren.

Wat betekent mijn avatar?


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Entititeiten gescheiden houden is een heel prima uitgangspunt.

Vaak zijn dergelijke zgn. 1:1 relaties tussen 2 entiteiten een n:m relatie waarbij n=1 en 0 < m < 1. Als je de rechter-entiteit dus in een andere tabel stopt, levert dit bij een left join ook null-waarden op, 't zelfde effect dus als je 't in eenzelfde tabel zou zetten met NULL als default.

Toch zou ik liever voor 2 tabellen gaan in dit geval. Je houdt in je databaselayout dan toch een zuiverder representatie van je gegevensmodel (imho)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Je moet bij een 1-1 relatie een verschil maken tussen het logisch model en de technische implementatie.
Logisch kan het heel handig zijn om het gescheiden te houden. Technisch is het afhankelijk van het DBMS of lege velden ballast zijn en of je dus gaat kiezen voor 1 of meerdere tabellen.
Daarnaast kunnen functionele eisen als autorisatie ook spiltsing van tabellen nuttig maken.
Pagina: 1