alle records uit hoofdtabel en bijbehorende records uit kindtabel

Status
Niet open voor verdere reacties.

CoenEnAccess

Gebruiker
Lid geworden
7 jun 2016
Berichten
44
Ik heb een "hoofdtabel", waarvan ik alle records wil zien, en een kindtabel waarbij ik op basis van verschillende criteria de bijbehorende records wil zien. Als er geen bijbehorend record is, wil ik lege velden zien.

Ik dacht dat dit met een left outerjoin geregeld kon worden, maar krijg dit in Access niet voor elkaar.

In bijlage 2 queries opgenomen. De eerste (q1) is de simpelste: doel is hier op basis van 1 criterium uit de kindtabel alle records uit de hoofdtabel te tonen, en indien er bijbehorende records zijn in de kindtabel, dan dienen die getoond te worden, en anders lege velden. Maar dit werkt dus al niet.

De tweede query toont 2x dezelfde kindtabel, waarbij de data ook 2x verschillende criteria wordt opgegeven. Deze query is wat ik uiteindelijk wil bereiken (maar vanzelfsprekend ook niet lukt), maar wat ik wil is dus alle records uit tabel Item (de hoofdtabel), en, indien van toepassing, gerelateerde records zien uit tabel propertytextanswer waarbij gefilterd wordt op een sleutelveld met waarde 19. Als die records uit de kindtabel niet aanwezig zijn, wens ik lege velden te zien. Daarnaast wil ik uit dezelfde tabel op basis van hetzelfde sleutelveld records zien op basis van een andere filterwaarde (20), en als die niet aanwezig zijn wederom lege velden.

Het lijkt me zoiets simpel, maar ik kom er niet uit. Kan iemand me uitleggen welke denkfout ik maak?
 

Bijlagen

  • forumvraag.zip
    84,6 KB · Weergaven: 25
op basis van 1 criterium uit de kindtabel alle records uit de hoofdtabel te tonen, en indien er bijbehorende records zijn in de kindtabel, dan dienen die getoond te worden, en anders lege velden. Maar dit werkt dus al niet.
Dit lijkt mij logisch; als ik in de tabel PropertyTextAnswer kijk, dan zijn alle ItemID's minstens één keer gebruikt. Je zult dus nooit lege velden krijgen. Ik heb met de hand een aantal records verwijderd uit die tabel, en daar deze query op los gelaten:
PHP:
SELECT Item.Id, Item.ItemTypeId, Item.CreationDate, PropertyTextAnswer.ItemId
FROM PropertyTextAnswer RIGHT JOIN Item ON PropertyTextAnswer.[ItemId] = Item.[Id]
WHERE (((PropertyTextAnswer.ItemId) Is Null));
Deze gaf vervolgens wél rijen terug. Of mis ik wat uit je verhaal?
 
En als aanvulling: nu krijg ik met deze query in q2 (niet de jouwe, dat klopt) wél de lege rijen te zien:
PHP:
SELECT Item.Id, PropertyTextAnswer.PropertyTextQuestionId, PropertyTextAnswer.Description
FROM Item LEFT JOIN PropertyTextAnswer ON Item.Id = PropertyTextAnswer.ItemId
GROUP BY Item.Id, PropertyTextAnswer.PropertyTextQuestionId, PropertyTextAnswer.Description
HAVING (((PropertyTextAnswer.PropertyTextQuestionId)=19 Or (PropertyTextAnswer.PropertyTextQuestionId) Is Null));
 
Nog niet het gewenste resultaat / voorbeeld uitgewerkt

Dank voor je reactie Octafish, helaas nog niet het gewenste resultaat. Zal misschien ook liggen aan mijn manier van beschrijven:), dus ik heb een voorbeeld uitgewerkt:

In de bijgevoegde access heb ik de hoeveelheid data verminderd tot slechts 4 records in de tabel item. Daarnaast heb ik een excel toegevoegd waarin ik de gewenste output heb genoemd.

Gewenst is dus alle records te zien uit de tabel Item, ongeacht of er records aanwezig zijn in het kindtabel PropertyTextAnswer. En daarnaast wil ik uit de tabel PropertyTextAnswer, in eerste kolom alle gerelateerde records zien gefilterd op een eerste sleutelwaarde, en daarnaast in de tweede kolom alle gerelateerde records zijn gefilterd op een andere sleutelwaarde.
 

Bijlagen

  • Octafish.xlsx
    11,2 KB · Weergaven: 22
  • forumvraag - Octafish.zip
    26,8 KB · Weergaven: 24
Maak eerst 3 aparte queries : qry1:alle records uit PropertyTextAnswer gefilterd op eerste antwoord, qry2:alle records uit PropertyTextAnswer gefilterd op tweede antwoord, qry3:alle records uit PropertyTextAnswer gefilterd op derdeantwoord. Vervolgens kan je elke query met een outer join linken aan de hoofdtabel.
3Answers.JPG
 
Ik mis de tabel PropertyTextQuestion in je voorbeeld; wil je een nette query (en dat kan denk ik met één query) dan moet je die tabel er ook bij aanleveren.
 
Het kan, op basis van jouw voorbeeldje, overigens ook wel, en met één query zoals ik al dacht.
Code:
TRANSFORM First(Description) AS Antwoord
SELECT Item.Id
FROM Item LEFT JOIN PropertyTextAnswer ON Item.Id = PropertyTextAnswer.ItemId
GROUP BY Item.Id
PIVOT PropertyTextQuestionId;
 
Ik heb 'm ook nog even in je andere db gezet, en daar werkt hij ook prima. Je kunt de lege kolom nog verwijderen met deze aanpassing:
Code:
TRANSFORM First(Description) AS Beschrijving
SELECT Item.Id
FROM Item LEFT JOIN PropertyTextAnswer ON Item.Id = PropertyTextAnswer.ItemId
WHERE PropertyTextQuestionId Is Not Null
GROUP BY Item.Id
ORDER BY PropertyTextQuestionId
PIVOT PropertyTextQuestionId;
 
Hij doet het!

Beste Octafish en NoellaG, hartstikke bedankt! Beide oplossingen werken en heb ik geüpload voor de leden die mogelijk met een vergelijkbare vraag de site gaan bezoeken.

Thanks, dit helpt me enorm op weg!
 

Bijlagen

  • forumvraag - Octafish NoellaG.zip
    26,8 KB · Weergaven: 17
Ik raad je aan de methode van noella niet te gebruiken; in je eerste db heb je al 8 verschillende antwoorden. Dat zou betekenen dat je acht extra queries moet maken (voor elk antwoord één) voordat je het eindresultaat hebt. Erg onhandig en omslachtig, vooral als je bedenkt dat je bij nóg een extra antwoord weer terug naar de tekentafel kan. Terwijl je aan de kruistabel niets hoeft te veranderen; die blijft altijd het juiste resultaat geven. Ik heb de 3 queries van noella naar je eerste db overgehaald, en kreeg dus een verkeerd eindresultaat. Mijn advies: gebruik deelqueries alleen als het niet anders kan. Kun je iets met standaard functionaliteit oplossen, doe dat dan vooral :)
 
En om dat te laten zien, heb ik de oplossing van noella in je eerste db gezet, zodat je het met eigen ogen kan zien :).
 

Bijlagen

  • forumvraag.zip
    81,7 KB · Weergaven: 19
Eerste regel van het Octafish forum: alleen naar Octafish luisteren
 
Slecht uit bed opgestaan Noella? Of probeer je TS alsnog te helpen met een goede oplossing? Je weet zelf toch ook wel dat jouw oplossing niet heel erg goed is?
 
Volgens mij hebben beide queries voor- en nadelen? Voordeel van de kruistabel is dat deze altijd resultaat geeft op basis van de aanwezige data. Dit helpt mij in het maken van een export-knop voor exporteren data naar Excel.
De query van Noella is idd een stuk omslachtiger om samen te stellen, maar deze denk ik te moeten gebruiken als datasource voor een formulier. Met die aanpak krijg ik gegarandeerd hetzelfde aantal kolommen (ongeacht de selectie op de data die gemaakt is), kan ik de individuele kolommen benoemen (nodig voor samenstellen formulieren) en volgordelijkheid bepalen.

Nogmaals dank voor jullie input!
 
Met die aanpak krijg ik gegarandeerd hetzelfde aantal kolommen (ongeacht de selectie op de data die gemaakt is), kan ik de individuele kolommen benoemen (nodig voor samenstellen formulieren) en volgordelijkheid bepalen.
Dat formulier vullen kan uiteraard óók met de kruistabel. Een formulier kun je dynamisch maken/vullen op basis van VBA. Dat werkt nog steeds een stuk makkelijker dan een aantal 'vaste' queries maken.

Overigens ging je vraag daar niet over, en je eerste bijlage ook niet. Daarin zaten meer mogelijkheden dan je in je ingekrompen voorbeeld had gezet. Je hebt nooit gezegd dat je maar drie kolommen terug wilde zien. Noch welke dat dan zouden moeten zijn. Ga, als dat kan, altijd voor oplossingen waar je niet aan hoeft te sleutelen, en die dus betrouwbaar zijn en blijven. In mijn optiek is de oplossing van noella dat dus niet.
 
Klopt Octafish, jullie hebben me ook verder geholpen dan puur het probleem dat ik gelogd heb:)
 
De grap is dat je een kruistabel dus óók kunt filteren, zodat je nog steeds met één query kunt volstaan. En ik geef je op een briefje dat dat een stuk makkelijker te onderhouden is dan 4 losse queries. Ik geef het maar mee ter overweging... Je moet uiteraard vooral doen waar jíj je gelukkig in voelt :).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan