query met verschillende velden

Status
Niet open voor verdere reacties.

Donvespa

Gebruiker
Lid geworden
6 okt 2009
Berichten
21
Ik vroeg me af of het volgende mogelijk is

Ik heb een veld klant en een veld product

ik wil nu een query maken waarin alle velden en alle producten achter elkaar zichtbaar zijn

dus bv klant A product x
klant B product y

in Query komt

klant A
klant B
product x
product y

Dit kan misschien ook door de twee gegevens in aparte tabellen te plaatsen maar de producten worden dan toch aan de klanten gelinkt door een één op veel relatie waardoor ik nog de uitkomst van mijn probleem niet vind.

Merci!!
 
denk niet dat gaat wat je wil. Zover ik weet gaat elke klant een nieuwe regel op leveren. In princripe is niet erg je lost dit gewoon op door in programma taal een for loop te maken en een foreach.


Code:
// sql

// tabel klant , koppel , product 
// klant = id , naam
// koppel = klip , pr
// product = id ,naam

array=  Select kl.*, pr.* from klant where klant kl, koppel kp , product where kl.id = kp.klid and  pr.id = kp.pr group by kl.id

// enkel tabel

array = select * from tabel order by id

// je hebt nu een array

// je hoeft geen -1 te omdat je nooit het eind haal
for(int i=0; i < count(array); i++)
{
 foreach (from$array as = $item)
{
echo  "$item"
}
}

je dient zelf het query element aan te geven. Ik hoop dat je iets aan me voorbeeld heb
 
Je kunt dat doen met een Totalen query.
Daarbij kies je eerst het veld Klanten. Zet de knop <Totalen> aan, en je hebt een lisjt met unieke klantnamen. Datzelfde doe je voor de producten.
Wil je de twee bij elkaar in één tabel, zoals in je voorbeeldje, dan kun je de twee queries combineren met een Union query. Die ziet er zo uit:
Code:
Select Klantnaam FROM qKlanten
Union All
Select Product FROM qProducten
Deze query moet je met de hand maken, door hem in te typen in het SQL venster van het Query-ontwerpscherm.
 
Je kunt dat doen met een Totalen query.
Daarbij kies je eerst het veld Klanten. Zet de knop <Totalen> aan, en je hebt een lisjt met unieke klantnamen. Datzelfde doe je voor de producten.
Wil je de twee bij elkaar in één tabel, zoals in je voorbeeldje, dan kun je de twee queries combineren met een Union query. Die ziet er zo uit:
Code:
Select Klantnaam FROM qKlanten
Union All
Select Product FROM qProducten
Deze query moet je met de hand maken, door hem in te typen in het SQL venster van het Query-ontwerpscherm.

vergeet niet je wanneer je as gebruikt bijvoorbeeld
Code:
klant.naam as     naam
product.naam as  naam

je voor elkaar krijg op sql niveua
Bij een union select die je altijd de zelfde tabel kolumen te hebben met een as kan je dit omzeilen.
 
Ik snap je niet helemaal, maar ik vermoed dat je wilt aangeven dat je een kolomnaam moet definiëren? Dat zou inderdaad kunnen, maar is niet noodzakelijk, omdat access in dat geval de eerste kolomnaam gebruikt. Wat wel geldt, is dat het aantal kolommen gelijk moet zijn. Maar dat is met een query van 1 kolom wel te doen...
 
Ik snap je niet helemaal, maar ik vermoed dat je wilt aangeven dat je een kolomnaam moet definiëren? Dat zou inderdaad kunnen, maar is niet noodzakelijk, omdat access in dat geval de eerste kolomnaam gebruikt. Wat wel geldt, is dat het aantal kolommen gelijk moet zijn. Maar dat is met een query van 1 kolom wel te doen...

kolomnaam dient naar mij weten altijd gelijk aan elkaar te zijn. Het aantal kan je altijd vervalsen door "" te gebruiken in het statement.

Misschien dat je zo snapt. Naar mij beleving is de kolomnaam van tabel a dient gelijk te zijn aan kolomnaam van tabel b dit kan je omzielen door AS te gebruiken. en dan beide zelfde naam te geven.
 
Je hoeft het niet aan mij uit te leggen; ik denk dat ik er meer van snap dan jij ;) Het gaat uiteraard om de vraagsteller... De kolomnaam hoeft in ieder geval niet gelijk te zijn in Access.
 
Laatst bewerkt:
oracle, mysql gaat over zijn nek als de kolumnamen niet gelijk zijn. Dat Acces niet over zijn nek gaat verbaast met eigenlijk. IK hoop in iedergeval dat de vraag beantwoord is.
 
Laatst bewerkt:
Dit is niet voor niks een Access forum ;)
 
Tilt

Ik sla eigenlijk wat tilt bij jullie uitleg, maar zal toch eens proberen, resultaat volgt

Alvast bedankt voor jullie advies
 
het marcheert

hallo het werkt, ik heb nu alles op een rij (letterlijk en figuurlijk) maar ik zal nu natuurlijk nog iets moeilijker doen, kan ik aan de query nu kolommen toevoegen want ik heb zowel over de producten als over de klanten meer info nodig.

Merci
 
Wat heb je tot nu toe gemaakt, en wat wil je er verder mee? Als je een Union query hebt gemaakt, zoals we hierboven hebben uitgelegd, dan kun je daar wel extra kolommen aan toevoegen, maar de hoofdregel daarbij is dus dat je in elke subquery evenveel kolommen gebruikt, en dat je toch (neem ik aan) de gegevens bij elkaar wilt houden in de eindkolommen, zodat elke kolom wel de juiste gegevens bevat...
Post anders ook een test db, zodat we wat gerichter mee kunnen denken.
 
voorbeeldje hierboven

Ik werk dus niet met klanten en producten maar met voorstellingen en inleidingen.

Het probleem is dat voor de medewerkers een formulier is opgemaakt met daarin alle voorstellingen en bijhorende inleidingen.

Voor de aangifte van onze cijfers moeten de inleidingen als omkaderingsvoorstellingen worden beschouwd en dus als aparte voorstelling meegeteld. Per inleiding moeten bovendien een aantal details gekend zijn zoals de voorstelling waar het bijhoort, het uur, de locatie,...

HEt zou dus ook een oplossing zijn als ik de inleidingen in een aparte tabel zet waarbij deze gelinkt zijn aan de voorstelling. Maar dan nog krijg ik ze niet achter elkaar in een query.

Nog een oplossing zou zijn dat per keer het vakje inleiding wordt aangevinkt, er een nieuwe voorstelling wordt aangemaakt dat niet gecatalogeerd is als podiumvoorstelling maar omkaderingsvoorstelling en dit niet in alle formulieren zichtbaar is (filter)

bedankt

Donvespa
 
Dus als ik het goed begrijp, zou je met deze drie queries uit de brand zijn:

Code:
SELECT Titel AS Voorstelling
FROM Voorstelling;
Selecteert alle voorstellingen.
Code:
SELECT [Titel] & " Inleiding" AS Voorstelling
FROM Voorstelling
WHERE (Inleiding=-1);
Selecteert alle voorstellingen met een inleiding, en zet het woord Inleiding achter de voorstellingsnaam.
Code:
SELECT Voorstelling FROM qVoorstelling
UNION ALL 
SELECT Voorstelling FROM qVoorstelling_Inleiding
ORDER BY VOORSTELLING;
Combineert de queries tot één tabel.
 
Perfect

Dik ok, maar ik wil nu ook andere gegevens zien zoals locatie, uur, datum en dergelijke...
 
Dat kun je neem ik aan nu toch zelf aanpassen? Zorg er in ieder geval voor dat je dezelfde hoeveelheid velden in de queries opneemt, anders werkt de UNION query niet.
Normaal gesproken kun je met "SELECT * FROM Voorstelling" alle velden uit een tabel selecteren. In jouw geval zou ik dat niet doen, omdat je (neem ik aan) het woord Inleiding, of iets dergelijks zult willen toevoegen aan de voorstellingsnaam? Je krijgt dan bijvoorbeeld zoiets:

Code:
SELECT Voorstelling.*, "Voorstelling" AS Type
FROM Voorstelling;

Code:
SELECT Voorstelling.*, "Inleiding" AS Type
FROM Voorstelling
WHERE Inleiding=-1;

Code:
SELECT * FROM qVoorstelling
UNION ALL SELECT * FROM qVoorstelling_Inleiding
ORDER BY ID;
 
ok hoor

Ik had het ondertussen gevonden maar dan had ik nog een heel domme andere vraag. Ik hebbepaalde queries waarin je de records vrij kan aanpassen. In andere queries lukt dit niet, hoe komt dit... Waarschijnlijk ligt de oplossing voor de hand, maar dan heb ik ook eens een gemakkelijke vraag gesteld.
 
Of het antwoord voor de hand ligt weet ik niet, maar ik kan je de verklaring (denk ik) wel geven ;)
Als je een query maakt, moet je die baseren op één tabel die je wilt kunnen muteren. Van die tabel kun je dan alle velden opnemen in je query. Als je aanvullende gegevens uit andere tabellen nodig hebt, voeg je die tabellen toe aan de query. De tabellen koppel je aan je hoofdtabel met de sleutelvelden. Om de query wijzigbaar te houden, mag je de Sleutelvelden uit de gekoppelde tabellen niet opnemen in de query. Dat hoeft ook niet, want het gerelateerde veld heb je immers al staan in de query. Vermijd dus het gebruik van het Asterix teken (*) bij het toevoegen van velden uit de overige tabellen, want dan neem je ook het sleutelveld uit die tabellen mee.
Hopelijk is het hiermee wat duidelijker...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan