Annons

Microsoft Access är utan tvekan det mest kraftfulla verktyget i hela Microsoft Office-sviten, men mystifierar (och ibland skrämmer) Office-elanvändare. Med en brantare inlärningskurva än Word eller Excel, hur ska någon täcka huvudet kring användningen av detta verktyg? Denna vecka, Bruce Epper kommer att titta på några av de frågor som stimuleras av denna fråga från en av våra läsare.

En läsare frågar:

Jag har problem med att skriva en fråga i Microsoft Access.

Jag har en databas med två produkttabeller som innehåller en gemensam kolumn med en numerisk produktkod och ett tillhörande produktnamn.

Jag vill ta reda på vilka produkter från tabell A som finns i tabell B. Jag vill lägga till en kolumn med namnet Resultat som innehåller produktnamnet från tabell A om det finns, och produktnamnet från tabell B när det inte finns i tabell A.

Har du några råd?

Bruces svar:

Microsoft Access är ett databashanteringssystem (DBMS) designat för användning på både Windows och Mac-maskiner. Den använder Microsofts Jet-databasmotor för databehandling och lagring. Det ger också ett grafiskt gränssnitt för användare som nästan eliminerar behovet av att förstå SQL (Structured Query Language).

instagram viewer

SQL är kommandospråket som används för att lägga till, radera, uppdatera och returnera information lagrad i databas samt ändra kärndatabaskomponenter som att lägga till, ta bort eller ändra tabeller eller index.

Utgångspunkt

Om du inte redan känner till Access eller någon annan RDBMS, föreslår jag att du börjar med dessa resurser innan du fortsätter:

  • Så vad är en databas? Så vad är en databas, hur som helst? [MakeUseOf Explains]För en programmerare eller en teknikentusiast är begreppet en databas något som man kan ta för givet. Men för många är konceptet med en databas i sig lite främmande ... Läs mer där Ryan Dube använder Excel för att visa grunderna för relationsdatabaser.
  • En snabbguide för att komma igång med Microsoft Access 2007 En snabbguide för att komma igång med Microsoft Access 2007 Läs mer vilket är en översikt på hög nivå av Access och komponenterna som innehåller en Access-databas.
  • En snabb handledning till tabeller i Microsoft Access 2007 En snabb handledning till tabeller i Microsoft Access 2007 Läs mer tittar på att skapa din första databas och tabeller för att lagra dina strukturerade data.
  • En snabb handledning om frågor i Microsoft Access 2007 En snabb handledning om frågor i Microsoft Access 2007 Läs mer tittar på medlen för att returnera specifika delar av data lagrade i databastabellerna.

Att ha en grundläggande förståelse för begreppen i dessa artiklar gör följande lite lättare att smälta.

Databasrelationer och normalisering

Föreställ dig att du driver ett företag som säljer 50 olika typer av widgetar över hela världen. Du har en kundbas på 1 250 och i en genomsnittlig månad säljer 10 000 widgets till dessa kunder. Du använder för närvarande ett enda kalkylblad för att spåra alla dessa försäljningar - effektivt en enda databastabell. Och varje år lägger tusentals rader till ditt kalkylblad.

platt-tabell-1platt-table-2

Ovanstående bilder är en del av det kalkylblad för orderspårning du använder. Säg nu att båda dessa kunder köper widgetar av dig flera gånger om året så att du har mycket fler rader för båda.

Om Joan Smith gifter sig med Ted Baines och tar sitt efternamn, måste varje rad som innehåller hennes namn nu ändras. Problemet förvärras om du råkar ha två olika klienter med namnet "Joan Smith". Det har blivit mycket svårare att hålla dina försäljningsdata konsekvent på grund av en ganska vanlig händelse.

Genom att använda en databas och normalisera uppgifterna kan vi dela ut objekt i flera tabeller som lager, klienter och beställningar.

normalisering

Om vi ​​bara tittar på klientdelen i vårt exempel skulle vi ta bort kolumnerna för klientnamn och klientadress och lägga dem i en ny tabell. På bilden ovan har jag också gjort saker bättre för att få mer detaljerad tillgång till data. Den nya tabellen innehåller också en kolumn för en primär nyckel (ClientID) - ett nummer som kommer att användas för att komma åt varje rad i den här tabellen.

I den ursprungliga tabellen där vi tog bort dessa data, lägger vi till en kolumn för en Foreign Key (ClientID) som är vad som länkar till rätt rad som innehåller informationen för just den här klienten.

När Joan Smith nu ändrar sitt namn till Joan Baines, behöver ändringen endast göras en gång i klienttabellen. Varje annan referens från sammanfogade tabeller drar rätt klientnamn och en rapport som tittar på vad Joan har köpt för de senaste 5 åren får alla order under både hennes jungfru och gifta namn utan att behöva ändra hur rapporten är genererad.

Som en extra fördel reducerar detta också den totala mängden lagrad konsumerad.

Gå med typer

SQL definierar fem olika typer av sammanfogningar: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER och CROSS. OUTER-nyckelordet är valfritt i SQL-uttalandet.

Microsoft Access tillåter användning av INNER (standard), LEFT OUTER, RIGHT OUTER och CROSS. FULL OUTER stöds inte som sådan, men genom att använda LEFT OUTER, UNION ALL och RIGHT OUTER kan det bli förfalskat till en kostnad av fler CPU-cykler och I / O-operationer.

Utgången från en CROSS-koppling innehåller varje rad i det vänstra bordet i par med varje rad i det högra bordet. Den enda gången jag någonsin har sett en CROSS-anslutning används är under belastningstest av databasservrar.

Låt oss titta på hur de grundläggande sammanfogningarna fungerar, så kommer vi att ändra dem så att de passar våra behov.

Låt oss börja med att skapa två tabeller, ProdA och ProdB, med följande designegenskaper.

access-bords defs

AutoNumber är ett automatiskt ökande långt heltal som tilldelas poster när de läggs till i tabellen. Alternativet Text ändrades inte, så det accepterar en textsträng upp till 255 tecken lång.

Nu fyll i dem med lite data.

åtkomst-tabeller

För att visa skillnaderna i hur 3 sammanfogningstyper fungerar har jag tagit bort poster 1, 5 och 8 från ProdA.

Skapa sedan en ny fråga genom att gå till Skapa> Query Design. Välj båda tabellerna i dialogrutan Visa tabell och klicka på Lägg tillStänga.

ny-query

Klicka på ProductID i tabellen ProdA, dra den till ProductID i tabellen ProdB och släpp musknappen för att skapa förhållandet mellan tabellerna.

design_view

Högerklicka på raden mellan tabellerna som representerar förhållandet mellan objekten och välj Gå med egenskaper.

join_properties

Som standard väljs anslutningstyp 1 (INNER). Alternativ 2 är en LEFT OUTER-koppling och 3 är en RIGHT OUTER-koppling.

Vi tittar först på INNER-anslutningen, så klicka på OK för att avbryta dialogen.

I frågeformatern väljer du fälten vi vill se från listrutorna.

designen-view-2

När vi kör frågan (den röda utropstecken i bandet) kommer det att visa fältet Produktnamn från båda tabellerna med värdet från tabellen ProdA i den första kolumnen och ProdB i den andra.

inre koppling

Observera att resultaten endast visar värden där ProductID är lika i båda tabellerna. Även om det finns en post för ProductID = 1 i tabellen ProdB, visas den inte i resultaten eftersom ProductID = 1 inte finns i tabellen ProdA. Detsamma gäller ProductID = 11. Det finns i tabellen ProdA men inte i tabellen ProdB.

design band

Genom att använda Visa-knappen på bandet och byta till SQL View, kan du se SQL-frågan genererad av designern som används för att få dessa resultat.

VÄLJ ProdA.ProductName, ProdB.ProductName FRÅN ProdA INNER JOIN ProdB PÅ ProdA.ProductID = ProdB.ProductID;

Gå tillbaka till designvy och ändra sammankopplingstypen till 2 (VÄNSTER UTAN). Kör frågan för att se resultaten.

left_outer_join

Som ni ser är varje post i tabellen ProdA representerad i resultaten medan endast de i ProdB som har en matchande produktID-post i tabellen ProdB dyker upp i resultaten.

Det tomma utrymmet i kolumnen ProdB.ProductName är ett specialvärde (NULL) eftersom det inte finns ett matchande värde i tabellen ProdB. Detta kommer att visa sig viktigt senare.

VÄLJ ProdA.ProductName, ProdB.ProductName FRÅN ProdA VÄNSTER GÅ MED ProdB PÅ ProdA.ProductID = ProdB.ProductID;

Prova samma sak med den tredje typen av kopplingar (RIGHT OUTER).

right_outer_join

Resultaten visar allt från tabellen ProdB medan den visar tomma (känd som NULL) -värden där ProdA-tabellen inte har ett matchande värde. Hittills kommer detta närmast de resultat som önskas i vår läsares fråga.

VÄLJ ProdA.ProductName, ProdB.ProductName FRÅN ProdA RIGHT JOIN ProdB PÅ ProdA.ProductID = ProdB.ProductID;

Använda funktioner i en fråga

Resultaten av en funktion kan också returneras som en del av en fråga. Vi vill att en ny kolumn med namnet 'Resultat' ska visas i vår resultatset. Dess värde kommer att vara innehållet i kolumnen Produktnamn i tabellen ProdA om ProdA har ett värde (det är inte NULL), annars ska det tas från tabellen ProdB.

Funktionen Immediate IF (IIF) kan användas för att generera detta resultat. Funktionen tar tre parametrar. Den första är ett villkor som måste utvärderas till ett sant eller falskt värde. Den andra parametern är värdet som ska returneras om villkoret är sant, och den tredje parametern är värdet som ska returneras om villkoret är falskt.

Hela funktionskonstruktionen för vår situation ser ut så här:

IIF (ProdA.ProductID är noll, ProdB.ProductName, ProdA.ProductName)

Lägg märke till att tillståndsparametern inte ser efter jämlikhet. Ett Null-värde i en databas har inte ett värde som kan jämföras med något annat värde, inklusive ett annat Null. Med andra ord är Null inte lika med Null. Någonsin. För att komma förbi detta, kontrollerar vi istället värdet med nyckelordet 'Är'.

Vi kunde också ha använt ‘Is Not Null’ och ändrat ordningen på True and False-parametrarna för att få samma resultat.

När du lägger till detta i Query Designer måste du skriva hela funktionen i fältet: posten. För att få den att skapa kolumnen "Resultat" måste du använda ett alias. För att göra detta, förorda funktionen med 'Resultat:' som visas i följande skärmdump.

höger yttre alias-resultat design

Den motsvarande SQL-koden för att göra detta skulle vara:

VÄLJ ProdA.ProductName, ProdB.ProductName, IIF (ProdA.ProductID är noll, ProdB.ProductName, ProdA.ProductName) AS resultat FRÅN ProdA RIGHT GÅ MED i ProdB PÅ ProdA.ProductID = ProdB.ProductID;

När vi kör denna fråga kommer det att producera dessa resultat.

right_outer_with_aliased_results

Här ser vi för varje post där tabellen ProdA har ett värde, det värdet återspeglas i kolumnen Resultat. Om det inte finns någon post i ProdA-tabellen visas posten från ProdB i Resultat, vilket är exakt vad vår läsare frågade.

För mer resurser för att lära dig Microsoft Access, kolla in Joel Lee's Så här lär du Microsoft Access: 5 gratis online-resurser Så här lär du Microsoft Access: 5 gratis online-resurserMåste du hantera en stor mängd data? Du bör undersöka Microsoft Access. Våra gratis studieresurser kan hjälpa dig komma igång och lära dig färdigheterna för mer komplexa projekt. Läs mer .

Bruce har spelat med elektronik sedan 70-talet, datorer sedan början av 80-talet och svarat korrekt på frågor om teknik som han inte har använt eller sett hela tiden. Han irriterar sig också genom att försöka spela gitarr.