Advertentie
Microsoft Access is misschien wel de krachtigste tool in de hele Microsoft Office-suite, maar het verbijstert (en soms schrikt) Office power-gebruikers. Met een steilere leercurve dan Word of Excel, hoe moet iemand zijn hoofd om het gebruik van deze tool wikkelen? Deze week, Bruce Epper zal enkele van de problemen bekijken die door deze vraag van een van onze lezers worden veroorzaakt.
Een lezer vraagt:
Ik heb problemen met het schrijven van een vraag in Microsoft Access.
Ik heb een database met twee producttabellen met een gemeenschappelijke kolom met een numerieke productcode en een bijbehorende productnaam.
Ik wil weten welke producten uit tabel A te vinden zijn in tabel B. Ik wil een kolom toevoegen met de naam Resultaten die de productnaam uit tabel A bevat als deze bestaat, en de productnaam uit tabel B als deze niet bestaat in tabel A.
Heb je enig advies?
Antwoord van Bruce:
Microsoft Access is een Database Management System (DBMS) dat is ontworpen voor gebruik op zowel Windows- als Mac-machines. Het maakt gebruik van de Jet-database-engine van Microsoft voor gegevensverwerking en opslag. Het biedt ook een grafische interface voor gebruikers die de noodzaak om Structured Query Language (SQL) te begrijpen bijna elimineert.
SQL is de opdrachttaal die wordt gebruikt voor het toevoegen, verwijderen, bijwerken en retourneren van informatie die is opgeslagen in de database en wijzig kerndatabasecomponenten zoals het toevoegen, verwijderen of wijzigen van tabellen of indices.
Startpunt
Als u nog niet bekend bent met Access of een ander RDBMS, raad ik u aan om met deze bronnen te beginnen voordat u doorgaat:
- Dus wat is een database? Dus wat is een database eigenlijk? [MakeUseOf Explains]Voor een programmeur of een technologieliefhebber is het concept van een database iets dat vanzelfsprekend is. Voor veel mensen is het concept van een database echter een beetje vreemd ... Lees verder waarbij Ryan Dube Excel gebruikt om de basisprincipes van relationele databases te tonen.
- Een beknopte handleiding om aan de slag te gaan met Microsoft Access 2007 Een beknopte handleiding om aan de slag te gaan met Microsoft Access 2007 Lees verder dat is een overzicht op hoog niveau van Access en de componenten waaruit een Access-database bestaat.
- Een korte tutorial over tabellen in Microsoft Access 2007 Een korte tutorial over tabellen in Microsoft Access 2007 Lees verder bekijkt het maken van uw eerste database en tabellen om uw gestructureerde gegevens op te slaan.
- Een korte tutorial over queries in Microsoft Access 2007 Een korte tutorial over queries in Microsoft Access 2007 Lees verder bekijkt de middelen om specifieke delen van de gegevens die in de databasetabellen zijn opgeslagen, te retourneren.
Als u een basiskennis heeft van de concepten in deze artikelen, wordt het volgende een beetje gemakkelijker te verteren.
Database relaties en normalisatie
Stel je voor dat je een bedrijf runt dat 50 verschillende soorten widgets over de hele wereld verkoopt. U heeft een klantenbestand van 1.250 en verkoopt in een gemiddelde maand 10.000 widgets aan deze klanten. U gebruikt momenteel één spreadsheet om al deze verkopen bij te houden - in feite één databasetabel. En elk jaar voegt duizenden rijen toe aan uw spreadsheet.
De bovenstaande afbeeldingen maken deel uit van de spreadsheet voor het bijhouden van bestellingen die u gebruikt. Stel nu dat beide klanten meerdere keren per jaar widgets van u kopen, zodat u voor beide veel meer rijen heeft.
Als Joan Smith met Ted Baines trouwt en zijn achternaam aanneemt, moet elke rij met haar naam nu worden gewijzigd. Het probleem wordt nog groter als je toevallig twee verschillende klanten hebt met de naam ‘Joan Smith’. Het is zojuist veel moeilijker geworden om uw verkoopgegevens consistent te houden vanwege een vrij algemeen evenement.
Door een database te gebruiken en de gegevens te normaliseren, kunnen we items opsplitsen in meerdere tabellen, zoals voorraad, klanten en bestellingen.
Als we alleen naar het clientgedeelte van ons voorbeeld kijken, zouden we de kolommen voor Clientnaam en Clientadres verwijderen en in een nieuwe tabel plaatsen. In de bovenstaande afbeelding heb ik ook dingen beter uitgesplitst voor meer gedetailleerde toegang tot de gegevens. De nieuwe tabel bevat ook een kolom voor een primaire sleutel (ClientID) - een nummer dat zal worden gebruikt om toegang te krijgen tot elke rij in deze tabel.
In de oorspronkelijke tabel waarin we deze gegevens hebben verwijderd, zouden we een kolom toevoegen voor een Foreign Key (ClientID), die naar de juiste rij linkt met de informatie voor deze specifieke client.
Als Joan Smith nu haar naam verandert in Joan Baines, hoeft de wijziging maar één keer te worden aangebracht in de Client-tabel. Elke andere referentie van samengevoegde tabellen zal de juiste naam van de klant opleveren en een rapport dat kijkt naar waar Joan voor heeft gekocht de afgelopen 5 jaar zullen alle bestellingen onder haar meisjesnaam en gehuwde naam worden geplaatst zonder dat de manier waarop het rapport is gewijzigd gegenereerd.
Als bijkomend voordeel vermindert dit ook de totale hoeveelheid verbruikte opslag.
Word lid van typen
SQL definieert vijf verschillende soorten joins: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER en CROSS. Het OUTER-sleutelwoord is optioneel in de SQL-instructie.
Microsoft Access staat het gebruik van INNER (standaard), LEFT OUTER, RIGHT OUTER en CROSS toe. FULL OUTER wordt als zodanig niet ondersteund, maar door LEFT OUTER, UNION ALL en RIGHT OUTER te gebruiken, kan het worden vervalst ten koste van meer CPU-cycli en I / O-bewerkingen.
De uitvoer van een CROSS-join bevat elke rij van de linkertafel in combinatie met elke rij van de rechtertabel. De enige keer dat ik ooit een CROSS-join heb gezien, is tijdens het laden van databaseservers.
Laten we eens kijken hoe de basis-joins werken, dan zullen we ze aanpassen aan onze behoeften.
Laten we beginnen met het maken van twee tabellen, ProdA en ProdB, met de volgende ontwerpeigenschappen.
Het AutoNummer is een automatisch oplopend lang geheel getal dat wordt toegewezen aan vermeldingen wanneer ze aan de tabel worden toegevoegd. De tekstoptie is niet gewijzigd en accepteert dus een tekenreeks van maximaal 255 tekens.
Vul ze nu met wat gegevens.
Om de verschillen te laten zien in hoe de 3 joinsoorten werken, heb ik de vermeldingen 1, 5 en 8 van ProdA verwijderd.
Maak vervolgens een nieuwe query door naar te gaan Maken> Queryontwerp. Selecteer beide tabellen in het dialoogvenster Tabel weergeven en klik op Toevoegen, dan Dichtbij.
Klik op ProductID in tabel ProdA, sleep het naar ProductID in tabel ProdB en laat de muisknop los om de relatie tussen de tabellen te creëren.
Klik met de rechtermuisknop op de lijn tussen de tabellen die de relatie tussen de items en selecteer Eigenschappen samenvoegen.
Standaard is join type 1 (INNER) geselecteerd. Optie 2 is een LEFT OUTER-join en 3 is een RIGHT OUTER-join.
We zullen eerst naar de INNER-join kijken, dus klik op OK om het dialoogvenster te sluiten.
Selecteer in de queryontwerper de velden die we willen zien in de vervolgkeuzelijsten.
Wanneer we de query uitvoeren (het rode uitroepteken in het lint), wordt het veld Productnaam uit beide tabellen weergegeven met de waarde uit tabel ProdA in de eerste kolom en ProdB in de tweede.
Merk op dat de resultaten alleen waarden tonen waar ProductID in beide tabellen gelijk is. Ook al is er een vermelding voor ProductID = 1 in tabel ProdB, deze wordt niet weergegeven in de resultaten omdat ProductID = 1 niet bestaat in tabel ProdA. Hetzelfde geldt voor ProductID = 11. Het bestaat in tabel ProdA maar niet in tabel ProdB.
Door de knop Weergeven op het lint te gebruiken en over te schakelen naar SQL-weergave, kunt u de SQL-query zien die door de ontwerper is gegenereerd om deze resultaten te verkrijgen.
SELECTEER ProdA.ProductName, ProdB.ProductName VAN ProdA INNER WORDEN ProdB ON ProdA.ProductID = ProdB.ProductID;
Ga terug naar Design View en verander het jointype in 2 (LEFT OUTER). Voer de query uit om de resultaten te zien.
Zoals u kunt zien, wordt elk item in tabel ProdA weergegeven in de resultaten, terwijl alleen die in ProdB met een overeenkomend ProductID-item in tabel ProdB worden weergegeven in de resultaten.
De lege ruimte in de kolom ProdB.ProductName is een speciale waarde (NULL) omdat er geen overeenkomende waarde is in tabel ProdB. Dit zal later belangrijk blijken te zijn.
KIES ProdA.ProductName, ProdB.ProductName VAN ProdA LINKS WORD LID VAN ProdB OP ProdA.ProductID = ProdB.ProductID;
Probeer hetzelfde met het derde type join (RIGHT OUTER).
De resultaten tonen alles van tabel ProdB terwijl het blanco (bekend als NULL) waarden toont waarbij de ProdA-tabel geen overeenkomende waarde heeft. Tot dusverre brengt dit ons het dichtst bij de gewenste resultaten in de vraag van onze lezer.
SELECTEER ProdA.ProductName, ProdB.ProductName VAN ProdA RECHTS WORD LID VAN ProdB OP ProdA.ProductID = ProdB.ProductID;
Functies gebruiken in een query
De resultaten van een functie kunnen ook worden geretourneerd als onderdeel van een query. We willen een nieuwe kolom met de naam 'Resultaten' in onze resultatenset. De waarde ervan is de inhoud van de kolom ProductName van tabel ProdA als ProdA een waarde heeft (het is niet NULL), anders moet deze uit tabel ProdB worden gehaald.
De Immediate IF (IIF) -functie kan worden gebruikt om dit resultaat te genereren. De functie heeft drie parameters. De eerste is een conditie die moet evalueren naar een True of False waarde. De tweede parameter is de waarde die moet worden geretourneerd als de voorwaarde Waar is, en de derde parameter is de waarde die moet worden geretourneerd als de voorwaarde Onwaar is.
De constructie met volledige functionaliteit voor onze situatie ziet er als volgt uit:
IIF (ProdA.ProductID is Null, ProdB.ProductName, ProdA.ProductName)
Merk op dat de voorwaardeparameter niet controleert op gelijkheid. Een Null-waarde in een database heeft geen waarde die kan worden vergeleken met een andere waarde, inclusief een andere Null. Met andere woorden, Null is niet gelijk aan Null. Ooit. Om hieraan voorbij te gaan, controleren we in plaats daarvan de waarde met het ‘Is’ -woord.
We hadden ook ‘Is Not Null’ kunnen gebruiken en de volgorde van de parameters True en False kunnen wijzigen om hetzelfde resultaat te krijgen.
Wanneer u dit in de Query Designer plaatst, moet u de hele functie typen in het veld Field: -item. Om ervoor te zorgen dat het de kolom 'Resultaten' maakt, moet u een alias gebruiken. Om dit te doen, moet u de functie voorafgaan met ‘Resultaten:’ zoals te zien is in de volgende schermafbeelding.
De equivalente SQL-code om dit te doen zou zijn:
SELECTEER ProdA.ProductName, ProdB.ProductName, IIF (ProdA.ProductID Is Null, ProdB.ProductName, ProdA.ProductName) ALS Resultaten VAN ProdA RECHTS SAMEN MET ProdB ON ProdA.ProductID = ProdB.ProductID;
Wanneer we deze query uitvoeren, levert deze resultaten op.
Hier zien we voor elk item waar tabel ProdA een waarde heeft, die waarde wordt weerspiegeld in de kolom Resultaten. Als er geen vermelding in de ProdA-tabel staat, verschijnt de vermelding uit ProdB in Resultaten, precies wat onze lezer vroeg.
Bekijk Joel Lee's voor meer bronnen voor het leren van Microsoft Access Hoe Microsoft Access te leren: 5 gratis online bronnen Hoe Microsoft Access te leren: 5 gratis online bronnenMoet u een grote hoeveelheid data beheren? Je moet kijken naar Microsoft Access. Onze gratis studiemiddelen kunnen u helpen aan de slag te gaan en de vaardigheden te leren voor complexere projecten. Lees verder .
Bruce speelt sinds de jaren 70 met elektronica, computers sinds het begin van de jaren 80 en beantwoordde nauwkeurig vragen over technologie die hij de hele tijd niet heeft gebruikt of gezien. Hij ergert zich ook door te proberen gitaar te spelen.