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

[SQL/Access] X aantal subtabbelen JOINEN in de hoofdtabel

Pagina: 1
Acties:

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Goedemorgen,

Bij het maken in een formulier in MS Access loop ik ergens tegen aan.
Ik wil 1 formulier hebben waar alle gegevens van medewerker X staan en bewerkt kunnen worden.
Opzich is dit geen probleem, echter zijn er enkele gegevens die met andere tabellen gekoppeld zijn.
Zo heb ik o.a. een tabel met alle functies en een tabel met de verschillende statussen van de compliance test. In de 'hoofdtabel' staan slechts de id's (functie_id en compliance_id).
Om al deze gegevens op te halen met 1 query wilde ik gebruik maken van JOINS. Verschillende JOINS moeten dus gebruik maken van de hoofdtabel.

Ik dacht dit te kunnen realiseren met de onderstaande query:
SQL:
1
2
3
4
5
6
7
SELECT 
*, 
functie.functie_naam AS functie, 
compliance.compliance_naam AS compliance
FROM medewerker 
LEFT JOIN functie ON medewerker.medewerker_functie=functie.functie_id  
LEFT JOIN compliance ON medewerker.medewerker_compliance=compliance.compliance_id;

Dit werkt helaas niet; ik krijg een melding over een 'Syntaxisfout' bij de tweede JOIN. Opzich niet zo heel gek, want hij moet niet de 'LEFT' joinen, maar de 'LEFT LEFT'.
In de bovengenoemde situatie zijn er dus 2 subtabellen die ik met de hoofdtabel wil koppelen. Het zullen er uiteindelijk meer worden.

Kortom, hoe kan je meerdere tabellen laten JOINEN in 1 hoofdtabel. INNER JOIN heeft geen zin, want het kan zijn dat sommige medewerkers nog geen functie/compliance status etc. hebben. Bij een INNER JOIN worden de medewerkers weggelaten waarbij gegevens ontbreken...

Ik hoop dat jullie mij verder kunnen helpen.
Alvast bedankt!

Proud member of the Cosmic Cows


  • momania
  • Registratie: Mei 2000
  • Laatst online: 17-11 18:29

momania

iPhone 30! Bam!

Volgens mij kan je * niet op deze manier combineren met selectie van kolommen.
Je wilt vast alleen die 2 kolommen plus alles uit medewerker, dus ipv * zou medewerker.* moeten werken.

Ik weet niet welke syntax fout je precies krijgt (zou handiger zijn als je die voortaan helemaal geeft), maar volgens mij klopt die niet helemaal ;)

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


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Ik heb er nu medewerker.* van gemaakt.

De syntaxisfout blijft:

code:
1
2
Syntaxisfout (operator ontbreekt) in query-expressie medewerker.medewerker_functie=functie.functie_id  
LEFT JOIN compliance ON medewerker.medewerker_compliance=compliance.compliance_id.

Proud member of the Cosmic Cows


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

momania schreef op vrijdag 16 mei 2008 @ 10:09:
Volgens mij kan je * niet op deze manier combineren met selectie van kolommen.
Dit mag wel in iedere mij bekende database.

Ik vermoed zelf dat Access in deze een beetje een rommeltje maakt van de aliassen en het onderscheid tussen veldnamen en tabelnamen kwijt is (wat ook niet enorm handig is opgezet in deze query imho overigens).

Professionele website nodig?


  • momania
  • Registratie: Mei 2000
  • Laatst online: 17-11 18:29

momania

iPhone 30! Bam!

curry684 schreef op vrijdag 16 mei 2008 @ 10:20:
[...]

Dit mag wel in iedere mij bekende database.
Ik heb het net even getest op Oracle, maar werkt niet. Als je alleen * gebruikt, verwacht Oracle daarna direct FROM. :)

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


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Betreft de aliassen in de query; correct.
Echter heb ik de aliassen veranderd, dit maakt verder niets uit en ik krijg dezelfde error.

Proud member of the Cosmic Cows


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

momania schreef op vrijdag 16 mei 2008 @ 10:22:
[...]

Ik heb het net even getest op Oracle, maar werkt niet. Als je alleen * gebruikt, verwacht Oracle daarna direct FROM. :)
Oracle is ook geen database :+

Professionele website nodig?


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Graag weer back on topic ;)

Proud member of the Cosmic Cows


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Probeer het eens met aliassen:
SQL:
1
2
3
4
SELECT f.functie_naam AS FunctieNaam, c.compliance_naam AS ComplianceNaam
FROM medewerker AS m
LEFT JOIN functie AS f ON m.medewerker_functie = f.functie_id  
LEFT JOIN compliance AS c ON m.medewerker_compliance = c.compliance_id;

De query zelf die je hebt is in principe perfect, dus geen idee waarom het niet werkt. Het is hoe dan ook een goede gewoonte om binnen grote queries aliassen te gebruiken. Ik heb zelf weinig Access-specifieke kennis, maar deze query is zo generiek SQL-92 dat ie perfect zou moeten werken.

Professionele website nodig?


Verwijderd

het probleem is dat in Access de syntax voor meerdere joins enigzins 'onduidelijk' is. Je moet namelijk met haakjes gaan werkern (ik heb het niet bedacth ;-)). Probeer in de designer je joins te leggen en kijk dan wat ie van de sql maakt, ik weet het namelijk niet uit mijn hoofd hoe het zit.
succes

Verwijderd

toch even een poging
SQL:
1
2
3
4
5
6
7
SELECT 
*, 
functie.functie_naam AS functie, 
compliance.compliance_naam AS compliance
FROM functie
LEFT JOIN(medewerker LEFT JOIN compliance ON medewerker medewerker.medewerker_compliance=compliance.compliance_id)
ON medewerker.medewerker_functie=functie.functie_id

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Bedankt voor de reacties.
De volgende code werkt:
SQL:
1
2
3
4
5
SELECT m.*, f.functie_naam, c.compliance_status
FROM 
(medewerker AS m
LEFT JOIN functie AS f ON m.medewerker_functie=f.functie_id )
LEFT JOIN  compliance AS c ON m.medewerker_compliance=c.compliance_id;

Maar.....
Hoe moet ik nu verder als ik meerdere tabellen wil koppelen?
2 tabellen eraan koppelen lukt dus, maar nu wil ik, zoals aangegeven, ook een 3e en misschien wel 4e tabel eraan koppelen.
Ik heb nu bijv nog. m.medewerker_einddoc die gekoppeld moet worden aan de tabel rechten ->
LEFT JOIN rechten AS r ON m.medewerker_einddoc=r.rechten_id.

Hoe kan ik deze nou toevoegen??

edit: r.rechten_naam moet uiteraard r.rechten_id zijn
het is aangepast

[ Voor 9% gewijzigd door Theske op 16-05-2008 11:52 ]

Proud member of the Cosmic Cows


Verwijderd

probeer het in de designer en kijk wat voor sql Access dan uitpoept. Het zal ongetwijfeld lelijk en nit leesbaar zijn, maar dan lukt het wel.
Als het niet gaat, kan je altijd een 2e view maken en via die view extra tabellen koppelen.

  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
ik krijg de volgende query terug van Access:
SQL:
1
2
3
4
SELECT m.*, c.compliance_status, f.functie_naam, r.rechten_naam
FROM ((medewerker AS m LEFT JOIN functie AS f ON m.medewerker_functie = f.functie_id) 
LEFT JOIN compliance AS c ON m.medewerker_compliance = c.compliance_id) 
LEFT JOIN rechten AS r ON m.medewerker_einddoc = r.rechten_id;

En ik krijg, bij het uitvoeren (het opslaan geeft geen error aan) de volgende error:
code:
1
Typen in expressie komen niet overeen

Proud member of the Cosmic Cows


  • Theske
  • Registratie: Februari 2003
  • Laatst online: 14-05-2017
Opgelost!
Het veld m.medewerker_einddoc was tekst en r.rechten_id was nummeriek, daardoor kreeg ik de laatste error.

Verder lukt het nu dus! :-D

Bedankt allen.

Proud member of the Cosmic Cows

Pagina: 1