Toon posts:

[SQL] JOIN probleem

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

Verwijderd

Topicstarter
Ik heb 2 tabellen in ACCESS

Tbl_Klant
KlantID KlantNaam
1          Pietje
2          Karel
3          Jan
4          Kees
5          Joep


Tbl_Bestand_Lid
LidID KltID Voorwaarde
1       2       A
2       3       B
3       4       B
4       3       A


Ik wil nu alle Klanten uit Tbl_Klant selecteren die niet voldoen aan Voorwaarde: B
Klant 3 en 4 voldoen aan B, maar klant 3 voldoet ook aan A. Deze mag uiteindelijk niet
voorkomen in de totaalselectie.

De volgende items zouden dus geselecteerd moeten zijn:
Klant 1, 2 en 5

Met de volgende query weet ik de klanten die voldoen aan de voorwaarde B te selecteren.
Maar ik krijg het niet voor elkaar, om de klanten te selecteren die niet aan B voldoen.

code:
1
SELECT * FROM Tbl_Klant LEFT JOIN Tbl_Bestand_Lid ON Tbl_Klant.KlantID = Tbl_Bestand_Lid.KltID WHERE Voorwaarde = B


Het volgende heb ik geprobeerd maar geeft Klant 3 als resultaat....
code:
1
SELECT * FROM Tbl_Klant LEFT JOIN Tbl_Bestand_Lid ON Tbl_Klant.KlantID = Tbl_Bestand_Lid.KltID WHERE NOT Voorwaarde = B


Iemand een tip?

[ Voor 24% gewijzigd door Verwijderd op 03-02-2005 00:06 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

code:
1
WHERE voorwaarde <> 'B'

:?

En vergeet niet dat als B een string is, deze tussen quotes moet.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:06
code:
1
SELECT * FROM Klant LEFT JOIN Lid ON Klant.id = Lid.KlantID AND Lid.Voorwaarde <> 'B'


Edit: ik moet sneller posten..

[ Voor 24% gewijzigd door sig69 op 02-02-2005 16:36 ]

Roomba E5 te koop


Verwijderd

Topicstarter
-NMe- schreef op woensdag 02 februari 2005 @ 16:29:
code:
1
WHERE voorwaarde <> 'B'

:?

En vergeet niet dat als B een string is, deze tussen quotes moet.
geeft hetzelfde resultaat als WHERE NOT Voorwaarde. = 'B'

(dit is overigens een fictief voorbeeld, daarom was ik die quotes vergeten bij de B)

[ Voor 12% gewijzigd door Verwijderd op 02-02-2005 16:55 . Reden: typo ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Professionele website nodig?


Verwijderd

Topicstarter
Ok daarmee ben ik al een heel eind!
ik heb nu de volgende SELECT:
code:
1
2
3
4
5
6
7
8
SELECT * FROM 
 Tbl_Klant AS t1 
LEFT OUTER JOIN 
 Tbl_Bestand_Lid AS t2 
ON 
 t1.KlantID = t2.KltID 
WHERE 
 t2.Voorwaarde IS NULL OR NOT t2.Voorwaarde = 'B'

Als een klant nu dubbel voorkomt, zoals bij klant 3 het geval is, en de voorwaarade is A dan wordt deze wel getoond...en dat is dus niet de bedoeling. Hoe kan ik die er dan nog uitfilteren?

het volgende had ik al geprobeerd, maar dat is niet echt bevorderlijk voor de snelheid:
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT * FROM 
 Tbl_Klant AS t1 
LEFT OUTER JOIN 
 Tbl_Bestand_Lid AS t2 
ON 
 t1.KlantID = t2.KltID 
WHERE 
 t2.Voorwaarde 
IS NULL OR 
 t1.KlantID NOT IN 
 (SELECT KltID FROM Tbl_Bestand WHERE Voorwaarde = 'B')

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 05:41
Je kunt een group by doen, en dan alleen de records opvragen waar het max. van het voorwaarde veld A is. Een numeriek voorwaardeveld zou dus een stuk handiger zijn.

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 01:25
Deze werkt, maar helaas met NOT IN (dus onacceptabel voor mij):
SQL:
1
2
SELECT * FROM Tbl_Klant
  WHERE KlantID NOT IN (SELECT KlantID FROM Tbl_Klant_Lid WHERE voorwaarde='b')


Een wat extremer, maar werkend: (zonder NOT IN):
SQL:
1
2
3
4
5
6
SELECT * FROM Tbl_Klant a 
  LEFT JOIN Tbl_Klant_Lid b1 ON a.KlantID = b1.KlantID 
  LEFT JOIN Tbl_Klant_Lid b2 ON a.KlantID = b2.KlantID AND b1.voorwaarde <> b2.voorwaarde
  WHERE (b1.voorwaarde IS NULL AND b2.voorwaarde IS NULL) 
     OR (b1.voorwaarde <>'b'   AND b2.voorwaarde IS NULL) 
     OR (b1.voorwaarde <>'b'   AND b2.voorwaarde <>'b') 


Succes ermee

Verwijderd

Topicstarter
StevenK schreef op woensdag 02 februari 2005 @ 20:42:
Je kunt een group by doen, en dan alleen de records opvragen waar het max. van het voorwaarde veld A is. Een numeriek voorwaardeveld zou dus een stuk handiger zijn.
Hmmm, ik zou totaal niet weten hoe ik dat in mijn situatie zou toe moeten passen. Overigens, die voorwaarde is in t echt ook een numerieke waarde. Maar om het wat minder complex te maken heb ik hier een letter gebruikt.

Verwijderd

Topicstarter
jvdmeer schreef op woensdag 02 februari 2005 @ 21:08:
Deze werkt, maar helaas met NOT IN (dus onacceptabel voor mij):
SQL:
1
2
SELECT * FROM Tbl_Klant
  WHERE KlantID NOT IN (SELECT KlantID FROM Tbl_Klant_Lid WHERE voorwaarde='b')


Een wat extremer, maar werkend: (zonder NOT IN):
SQL:
1
2
3
4
5
6
SELECT * FROM Tbl_Klant a 
  LEFT JOIN Tbl_Klant_Lid b1 ON a.KlantID = b1.KlantID 
  LEFT JOIN Tbl_Klant_Lid b2 ON a.KlantID = b2.KlantID AND b1.voorwaarde <> b2.voorwaarde
  WHERE (b1.voorwaarde IS NULL AND b2.voorwaarde IS NULL) 
     OR (b1.voorwaarde <>'b'   AND b2.voorwaarde IS NULL) 
     OR (b1.voorwaarde <>'b'   AND b2.voorwaarde <>'b') 


Succes ermee
Ik krijg een syntax fout(operator ontbreekt) bij:
code:
1
a.KlantID = b1.KlantID LEFT JOIN Tbl_Klant_Lid b2 ON a.KlantID = b2.KlantID


(ik gebruik overigens een Access database, dus zou kunnen dat die een probleem veroorzaakt?)

Verwijderd

Topicstarter
Ik heb eens gezocht of het misschien zou werken als ik haken rondom de joins zou zetten, maar dan krijg ik of de melding dat de join-expressie niet geldig is, of ik krijg nog steeds dezelfde fout met de operator ontbreekt

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 01:25
Verwijderd schreef op woensdag 02 februari 2005 @ 21:51:
[...]


Ik krijg een syntax fout(operator ontbreekt) bij:
code:
1
a.KlantID = b1.KlantID LEFT JOIN Tbl_Klant_Lid b2 ON a.KlantID = b2.KlantID


(ik gebruik overigens een Access database, dus zou kunnen dat die een probleem veroorzaakt?)
Dan denk ik dat de oorzaak bij Access ligt. Ik heb deze getest in MS-SQL. Misschien handig om je DBMS in de openingpost te plaatsen.

Werkt de "NOT IN" variant wel?

Verwijderd

Topicstarter
jvdmeer schreef op woensdag 02 februari 2005 @ 23:00:
[...]


Dan denk ik dat de oorzaak bij Access ligt. Ik heb deze getest in MS-SQL. Misschien handig om je DBMS in de openingpost te plaatsen.

Werkt de "NOT IN" variant wel?
de not in werkt wel jah... maar op jou eerdere advies was dat gebruik niet zo aan te raden toch?

En DBMS? wat is dat?

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 15-05 20:04
Verwijderd schreef op woensdag 02 februari 2005 @ 23:50:
[...]


de not in werkt wel jah... maar op jou eerdere advies was dat gebruik niet zo aan te raden toch?

En DBMS? wat is dat?
Database Management Systeem.
Microsoft Access in jouw geval.

  • mrFoce
  • Registratie: Augustus 2004
  • Laatst online: 08-05 18:30
Verwijderd schreef op woensdag 02 februari 2005 @ 23:50:
[...]


de not in werkt wel jah... maar op jou eerdere advies was dat gebruik niet zo aan te raden toch?

En DBMS? wat is dat?
databasemanagement-systeem

Verwijderd

Topicstarter
Ok thx!!!

Overigens ben ik in Access bezig geweest de bovenstaande query te bouwen met dat visuele ding.
Het probleem zit ten eerste in de haken.

De volgende code werkt (maar geeft niet het juiste resultaat)
code:
1
2
3
4
5
6
SELECT * FROM (Tbl_Klant a 
  LEFT JOIN Tbl_Klant_Lid b1 ON (a.KlantID = b1.KlantID)) 
  LEFT JOIN Tbl_Klant_Lid b2 ON (a.KlantID = b2.KlantID)
  WHERE (b1.voorwaarde IS NULL AND b2.voorwaarde IS NULL) 
     OR (b1.voorwaarde <>'b'   AND b2.voorwaarde IS NULL) 
     OR (b1.voorwaarde <>'b'   AND b2.voorwaarde <>'b')


Als ik de code nu uit wil breiden met
code:
1
LEFT JOIN Tbl_Klant_Lid b2 ON (a.KlantID = b2.KlantID -----> AND b1.voorwaarde <> b2.voorwaarde)

dan krijg je de melding: deze join-expressie wordt niet ondersteund

  • Sayko
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:40

Sayko

Knowledge Is Power

LEFT JOIN werkt niet in access
Je moet gebruiken LEFT OUTER JOIN

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 05:41
Verwijderd schreef op woensdag 02 februari 2005 @ 21:22:
[...]


Hmmm, ik zou totaal niet weten hoe ik dat in mijn situatie zou toe moeten passen. Overigens, die voorwaarde is in t echt ook een numerieke waarde. Maar om het wat minder complex te maken heb ik hier een letter gebruikt.
Waar ben je dan mee bezig ? Nou, vooruit dan, één keer:
code:
1
SELECT klantid FROM Tbl_Klant LEFT JOIN Tbl_Bestand_Lid ON Tbl_Klant.KlantID = Tbl_Bestand_Lid.KltID group by klantid having max(Voorwaarde)  = a

Hiermee krijg je alle klanten die wel aan voorwaarde a voldoen, maar niet aan b, vooropgesteld dat dit numerieke waarden zijn en dat b > a.

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


Verwijderd

Topicstarter
Hoodlum2000 schreef op donderdag 03 februari 2005 @ 00:22:
LEFT JOIN werkt niet in access
Je moet gebruiken LEFT OUTER JOIN
Nope ,geeft geen verschil!

En die GROUP by heeft helaas geen nut omdat de voorwaarde b<a of b>a kan zijn...

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 01:25
Na ongeveer 1,5 uur klooien in access. (Wat zitten daar veel beperkingen in) kwam ik op de volgende werkende code:
SQL:
1
2
3
4
5
6
7
SELECT a.klantid, a.klantnaam
FROM (Tbl_Klant AS a 
LEFT JOIN Tbl_Klant_lid AS b1 ON a.KlantId = b1.KlantID) 
LEFT JOIN Tbl_Klant_lid AS b2 ON a.KlantId = b2.KlantID
WHERE (b1.voorwaarde IS NULL AND b2.voorwaarde IS NULL) 
OR ((b1.voorwaarde <=b2.voorwaarde) AND (b1.voorwaarde<>'b'))
GROUP BY a.klantid, a.klantnaam HAVING count(*)=1


PS: dit werkt alleen voor de voorbeeldtabellen. Ik geef geen garanties voor de werkelijke data. Maar misschien heb je hieraan een voorbeeld.

[ Voor 20% gewijzigd door jvdmeer op 04-02-2005 16:35 ]


  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 05:41
Verwijderd schreef op vrijdag 04 februari 2005 @ 15:26:
[...]


Nope ,geeft geen verschil!

En die GROUP by heeft helaas geen nut omdat de voorwaarde b<a of b>a kan zijn...
Dan kun je daar toch rekening mee houden ?

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Hoodlum2000 schreef op donderdag 03 februari 2005 @ 00:22:
LEFT JOIN werkt niet in access
Je moet gebruiken LEFT OUTER JOIN
LEFT JOIN werkt wel degelijk in Access. Als je de foutmelding "deze join-expressie wordt niet ondersteund" krijgt heeft dit te maken met het niet tussen haakjes plaatsen van JOINS. Dit moet indien je meerdere JOINS specificeert, dus niet:
code:
1
2
3
SELECT * FROM tblA
LEFT JOIN tblB ON tblA.ID=tblB.ID
LEFT JOIN tblC ON tblB.ID=tblC.ID

maar (let op de haakjes)
code:
1
2
3
SELECT * FROM (tblA
LEFT JOIN tblB ON (tblA.ID=tblB.ID))
LEFT JOIN tblC ON (tblB.ID=tblC.ID)

Zie trouwens wel dat de TS dat doet in zijn 1e SQL statement.

It’s nice to be important but it’s more important to be nice


Verwijderd

Topicstarter
Jvandemeer...dammmn! Dankje! ...het WERKT!!!! _/-\o_ _/-\o_ _/-\o_

code:
1
2
3
4
5
6
7
Tbl_Klant AS a 
 LEFT JOIN Tbl_Bestand_lid AS b1 ON a.KlantId = b1.LidKlantID) 
 LEFT JOIN Tbl_Bestand_lid AS b2 ON a.KlantId = b2.LidKlantID
WHERE (b1.LidBBID IS NULL AND b2.LidBBID IS NULL) 
 OR ((b1.LidBBID <=b2.LidBBID) AND (b1.LidBBID<>...))
 OR ((b1.LidBBID >=b2.LidBBID) AND (b1.LidBBID<>...))
GROUP BY a.klantid, a.klantnaam HAVING count(*)=1

Ik heb nog 1 regel toegevoegd in mijn werkelijke situatie, zoals je kunt zien.
Dit werk perfect...en ja ik weet 't access werkt wat dat betreft niet zo handig.

Nogmaals heel erg bedankt..ik denk dat dit wel voldoende is!!!

[ Voor 8% gewijzigd door Verwijderd op 04-02-2005 17:10 ]

Pagina: 1