Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[SQL/Access] "join" op twee velden in een tabel

Pagina: 1
Acties:

  • ATS
  • Registratie: September 2001
  • Laatst online: 29-10 18:37
Ik loop tegen een vreemd probleem aan. Ik heb een Access query die dit soort resultaten oplevert:

ID 1ID 2value
120.23261
130.0016515
4120.24245
591.0
9170.3243

Daarbij heb ik een tabel met labels die bij die ID 1 en ID 2 velden horen:

IDlabel
1Een label
2Een ander label
3Weer een ander label

Alle waarden die in de eerste tabel als ID 1 of als ID 2 voorkomen, komen als ID voor in de Labels tabel. Daarnaast zitten er in deze Labels tabel nog veel meer records die niet in de eerste query/tabel voorkomen.

Wat ik nu wil is een selectie maken uit de Labels tabel op basis van welke ID's voorkomen in de tabel met waardes. Ik had daarvoor eerst het idee om gebruik te maken van een subquery:

SQL:
1
2
3
4
5
SELECT [Labels].ID, [Labels].label
FROM [Labels]
WHERE (
  (([Labels].ID) In (SELECT [values].[ID 1] FROM [values])) OR 
  (([Labels].ID) In (SELECT [values].[ID 2] FROM [values])) ;


Dit blijkt Access volledig op z'n plaat te helpen, terwijl de query prima en snel werkt met slechts één van de twee WHERE voorwaarden.

Een alternatieve benadering was een UNION:
SQL:
1
2
3
4
5
6
7
8
9
SELECT [Labels].ID, [Labels].label
FROM [Labels]
WHERE (
  (([Labels].ID) In (SELECT [values].[ID 1] FROM [values]))
UNION
SELECT [Labels].ID, [Labels].label
FROM [Labels]
WHERE (
  (([Labels].ID) In (SELECT [values].[ID 2] FROM [values]))

Dit heeft exact hetzelfde probleem als de eerste poging helaas.

Heeft iemand nog een ander idee hoe ik dit zou kunnen doen? Ik zou het heel graag in één query hebben.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL:
1
2
3
4
SELECT ...
FROM Values V
LEFT OUTER JOIN Labels L1 ON V.ID1 = L1.Id
LEFT OUTER JOIN Labels L2 ON V.ID2 = L2.id


Je kunt een tabel meerdere keren joinen door hem steeds een ander alias te geven.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
^^ Wat hij zegt. En wat extra leesvoeier: Hoe werken joins? ;)

[ Voor 13% gewijzigd door RobIII op 01-08-2008 10:30 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • ATS
  • Registratie: September 2001
  • Laatst online: 29-10 18:37
Ah, dank! Dat brengt me op een idee, inderdaad via het twee keer joinen van dezelfde tabel. Dat dat kon wist ik overigens wel, dat is zelfs hoe de Values query in elkaar zit (het is een correlatie tussen twee records uit de Labels tabel). Ik zal alleen even niet hoe ik dit weer kon gebruiken om de Labels tabel te filteren. Dit is het (werkende) resultaat:

SQL:
1
2
3
4
5
6
7
8
SELECT [Labels].ID, [Labels].label, [Values_1].ID1, [Values_2].ID2
FROM [Values] AS [Values_1] 
  RIGHT JOIN ([Values] AS [Values_2] 
    RIGHT JOIN [Labels] 
    ON [Values_1].ID1 = [Labels].ID) 
  ON [Values_2].ID2 = [Labels].ID
WHERE ( (Not (IsNull([Values_1].[ID1]))) 
     OR (Not (IsNull([Values_2].[ID2]))) );

[ Voor 23% gewijzigd door ATS op 01-08-2008 10:40 ]

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
En nu nog de schrijfwijze met de join criteria in het join gedeelte in plaats van in de where en dan is het helemaal mooi ;)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • ATS
  • Registratie: September 2001
  • Laatst online: 29-10 18:37
Errr.... huh? Hoe zou je dat doen, als ik vragen mag, zeker gezien er een OR tussen de where's staat?

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Heh, sorry. Ik keek verkeerd. Je doet het al "goed"

* P_de_B is echt nog niet wakker

Oops! Google Chrome could not find www.rijks%20museum.nl


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt op een join meer dan 1 conditie zetten:
SQL:
1
2
3
4
5
6
7
Select foo, bar, *
from mytable
join sometable on (mytable.id = sometable.id)
              and (mytable.type = 1)
              and (sometable.woot = 'test')
where blah = something
...

De rest laat ik aan jou over om uit te puzzelen ;)

[ Voor 7% gewijzigd door RobIII op 01-08-2008 11:07 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1