Hoi,
Ik heb een probleempje met het opstellen van een query. Hij werkt wel in mijn situatie, maar volgens mij is hij mis.
Stel je hebt volgende relaties:
A: a_id (prim. key), a_name, b_id ((weak) for. key)
B: b_id (prim. key), b_name, c_id (for. key)
C: c_id (prim. key), c_name
Nu is het zo dat A.b_id niet noodzakelijk naar een bestaande B.b_id moet wijzen (ik noem zo'n foreign key 'weak', maar dat terzijde), maar B.c_id moet wel naar een bestaande C.c_id wijzen. Dat betekent dus dat tussen A en B een 'LEFT JOIN' geldt (tussen A.b_id en B.b_id) en tussen B en C een gewone 'JOIN' (tussen B.c_id en C.c_id).
Nu wou ik volgende query maken (MySQL):
- is er een verwijzing van A.b_id naar B.b_id, dan is c_name != NULL
- is er geen verwijzing van A.b_id naar B.b_id, dan is c_name == NULL
Bovenstaande query werkt perfect in het eerste geval, maar niet in het tweede; dan geeft hij gewoon geen resultaten terug.
Als ik de 'INNER JOIN' vervang door een 'LEFT JOIN', dan werken beide gevallen. Maar dit is geen oplossing volgens mij, want het werkt gewoon 'toevallig':
omdat in mijn opzet de key B.c_id altijd (!) wijst naar een bestaande C.c_id, zal in dit geval de tweede (de nieuwe) 'LEFT JOIN' eigenlijk een gewone 'JOIN' zijn (want voor elke linkerkant B.c_id is er altijd een rechterkant C.c_id).
Maar wat als ik die restrictie niet had, en er dus toch waarden van B.c_id konden bestaan die niet voorkomen in C.c_id? Dan is het aanpassen van de 'INNER JOIN' naar 'LEFT JOIN' niet meer juist, want dan kan hij in bepaalde gevallen teveel teruggeven (als er voor een linkerkant B.c_id geen rechterkant C.c_id is)?
Mijn vraag is dus: hoe moet ik de query dan wel maken?
Ik heb een probleempje met het opstellen van een query. Hij werkt wel in mijn situatie, maar volgens mij is hij mis.
Stel je hebt volgende relaties:
A: a_id (prim. key), a_name, b_id ((weak) for. key)
B: b_id (prim. key), b_name, c_id (for. key)
C: c_id (prim. key), c_name
Nu is het zo dat A.b_id niet noodzakelijk naar een bestaande B.b_id moet wijzen (ik noem zo'n foreign key 'weak', maar dat terzijde), maar B.c_id moet wel naar een bestaande C.c_id wijzen. Dat betekent dus dat tussen A en B een 'LEFT JOIN' geldt (tussen A.b_id en B.b_id) en tussen B en C een gewone 'JOIN' (tussen B.c_id en C.c_id).
Nu wou ik volgende query maken (MySQL):
code:
Ik wil dus a_name en c_name opvragen, waarvoor geldt:1
2
3
4
5
| SELECT a_name, c_name FROM A LEFT JOIN B ON A.b_id = B.b_id INNER JOIN C ON B.c_id = C.c_id WHERE a_id = 4 |
- is er een verwijzing van A.b_id naar B.b_id, dan is c_name != NULL
- is er geen verwijzing van A.b_id naar B.b_id, dan is c_name == NULL
Bovenstaande query werkt perfect in het eerste geval, maar niet in het tweede; dan geeft hij gewoon geen resultaten terug.
Als ik de 'INNER JOIN' vervang door een 'LEFT JOIN', dan werken beide gevallen. Maar dit is geen oplossing volgens mij, want het werkt gewoon 'toevallig':
omdat in mijn opzet de key B.c_id altijd (!) wijst naar een bestaande C.c_id, zal in dit geval de tweede (de nieuwe) 'LEFT JOIN' eigenlijk een gewone 'JOIN' zijn (want voor elke linkerkant B.c_id is er altijd een rechterkant C.c_id).
Maar wat als ik die restrictie niet had, en er dus toch waarden van B.c_id konden bestaan die niet voorkomen in C.c_id? Dan is het aanpassen van de 'INNER JOIN' naar 'LEFT JOIN' niet meer juist, want dan kan hij in bepaalde gevallen teveel teruggeven (als er voor een linkerkant B.c_id geen rechterkant C.c_id is)?
Mijn vraag is dus: hoe moet ik de query dan wel maken?
[ Voor 8% gewijzigd door Anoniem: 21156 op 31-12-2003 15:37 ]