Annonse

Microsoft Access er uten tvil det kraftigste verktøyet i hele Microsoft Office-pakken, men det mystifiserer (og noen ganger skremmer) Office-strømbrukere. Hvordan er det noen som skal brette hodet rundt bruken av dette verktøyet med en brattere læringskurve enn Word eller Excel? Denne uka, Bruce Epper vil se på noen av problemene som er ansporet av dette spørsmålet fra en av leserne våre.

En leser spør:

Jeg har problemer med å skrive et spørsmål i Microsoft Access.

Jeg har en database med to produkttabeller som inneholder en felles kolonne med en numerisk produktkode og et tilhørende produktnavn.

Jeg vil finne ut hvilke produkter fra tabell A som finnes i tabell B. Jeg vil legge til en kolonne som heter Resultater som inneholder produktnavnet fra tabell A hvis den finnes, og produktnavnet fra tabell B når den ikke eksisterer i tabell A.

Har du noen råd?

Bruces svar:

Microsoft Access er et databasestyringssystem (DBMS) designet for bruk på både Windows og Mac-maskiner. Den bruker Microsofts Jet-databasemotor for databehandling og lagring. Det gir også et grafisk grensesnitt for brukere som nesten eliminerer behovet for å forstå SQL (Structured Query Language).

SQL er kommandospråket som brukes til å legge til, slette, oppdatere og returnere informasjon som er lagret i database samt endre kjernedatabasekomponenter som å legge til, slette eller endre tabeller eller indekser.

Utgangspunktet

Hvis du ikke allerede er kjent med Access eller en annen RDBMS, vil jeg foreslå at du starter med disse ressursene før du fortsetter:

  • Så hva er en database? Så hva er en database, likevel? [MakeUseOf Explains]For en programmerer eller en teknologientusiast er konseptet med en database noe som kan tas for gitt. For mange mennesker er imidlertid konseptet med en database litt utenlandsk ... Les mer der Ryan Dube bruker Excel for å vise det grunnleggende i relasjonsdatabaser.
  • En rask guide for å komme i gang med Microsoft Access 2007 En rask guide for å komme i gang med Microsoft Access 2007 Les mer som er en oversikt på høyt nivå av Access og komponentene som inneholder en Access-database.
  • En rask opplæring til tabeller i Microsoft Access 2007 En rask opplæring til tabeller i Microsoft Access 2007 Les mer tar en titt på å lage din første database og tabeller for å lagre strukturerte data.
  • En rask opplæring om spørsmål i Microsoft Access 2007 En rask opplæring om spørsmål i Microsoft Access 2007 Les mer ser på midlene for å returnere spesifikke deler av dataene som er lagret i databasetabellene.

Å ha en grunnleggende forståelse av konseptene gitt i disse artiklene vil gjøre følgende litt lettere å fordøye.

Databaseforhold og normalisering

Se for deg at du driver et selskap som selger 50 forskjellige typer widgets over hele verden. Du har en kundegrunnlag på 1 250 og selger 10 000 widgets til disse kundene i en gjennomsnittlig måned. Du bruker for øyeblikket et enkelt regneark for å spore alle disse salgene - effektivt en enkelt databasetabell. Og hvert år legger tusenvis av rader til regnearket.

flate-tabell-1flate-tabell-2-

Bildene ovenfor er en del av regnearket for bestillingssporing du bruker. Si nå at begge disse kundene kjøper småprogram fra deg flere ganger i året, så du har langt flere rader for begge.

Hvis Joan Smith gifter seg med Ted Baines og tar etternavnet, må hver eneste rad som inneholder navnet hennes nå endres. Problemet blir forsterket hvis du tilfeldigvis har to forskjellige klienter med navnet ‘Joan Smith’. Det har bare blitt mye vanskeligere å holde salgsdataene konsistente på grunn av en ganske vanlig hendelse.

Ved å bruke en database og normalisere dataene, kan vi skille ut elementer i flere tabeller som inventar, klienter og ordrer.

normalisering

Bare å se på klientdelen av eksemplet, ville vi fjerne kolonnene for klientnavn og klientadresse og lagt dem inn i en ny tabell. På bildet over har jeg også brutt ting bedre ut for mer granulær tilgang til dataene. Den nye tabellen inneholder også en kolonne for en Primærnøkkel (ClientID) - et nummer som vil bli brukt for å få tilgang til hver rad i denne tabellen.

I den originale tabellen der vi fjernet disse dataene, vil vi legge til en kolonne for en fremmed nøkkel (ClientID), som er det som lenker til riktig rad som inneholder informasjonen for denne klienten.

Når Joan Smith nå endrer navn til Joan Baines, trenger endringen bare å gjøres en gang i klienttabellen. Hver annen henvisning fra sammenføyde tabeller vil trekke det riktige klientnavnet og en rapport som ser på hva Joan har kjøpt for de siste 5 årene får alle ordrene under både jomfruen og gifte navn uten å måtte endre hvordan rapporten er generert.

Som en ekstra fordel, reduserer dette også den totale mengden lagret forbruk.

Bli med typer

SQL definerer fem forskjellige typer sammenføyninger: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER og CROSS. OUTER-nøkkelordet er valgfritt i SQL-setningen.

Microsoft Access tillater bruk av INNER (standard), LEFT OUTER, RIGHT OUTER og CROSS. FULL OUTER støttes ikke som sådan, men ved å bruke LEFT OUTER, UNION ALL og RIGHT OUTER, kan det forfalskes på bekostning av flere CPU-sykluser og I / O-operasjoner.

Utgangen fra en CROSS-sammenføyning inneholder hver rad i det venstre bordet sammenkoblet med hver rad i det høyre bordet. Den eneste gangen jeg noen gang har sett en CROSS bli brukt er under belastningstesting av databaseservere.

La oss se på hvordan de grunnleggende sammenføyningene fungerer, så endrer vi dem etter behov.

La oss starte med å lage to tabeller, ProdA og ProdB, med følgende designegenskaper.

access-table-defs

AutoNumber er et automatisk økende langt heltall som er tilordnet oppføringer når de legges til i tabellen. Tekstalternativet ble ikke endret, så det vil godta en tekststreng på opptil 255 tegn.

Nå, fyll dem med noen data.

Åpent tilgjengelig tabeller

For å vise forskjellene i hvordan de tre sammenføyningstypene fungerer, har jeg slettet oppføringer 1, 5 og 8 fra ProdA.

Deretter oppretter du en ny spørring ved å gå til Lag> Query Design. Velg begge tabellene i dialogboksen Vis tabell og Klikk Legg til, deretter Lukk.

ny-spørring

Klikk på ProductID i tabellen ProdA, dra den til ProductID i tabellen ProdB og slipp museknappen for å opprette forholdet mellom tabellene.

design_view

Høyreklikk på linjen mellom tabellene som representerer forholdet mellom elementene og Velg Bli med egenskaper.

join_properties

Som standard er velg type 1 (INNER) valgt. Alternativ 2 er en VENSTRE YTRE sammenføyning og 3 er en HØYRE YTRE forbindelse.

Vi vil se på INNER bli først, så klikk OK for å avvise dialogen.

I feltutvikleren velger du feltene vi vil se fra rullegardinlistene.

utformingen-syn-2-

Når vi kjører spørringen (det røde utropstegnet i båndet), vil det vise feltet Produktnavn fra begge tabeller med verdien fra tabellen ProdA i den første kolonnen og ProdB i den andre.

inner_join

Legg merke til resultatene viser bare verdier der ProductID er lik i begge tabeller. Selv om det er en oppføring for ProductID = 1 i tabell ProdB, vises den ikke i resultatene siden ProductID = 1 ikke eksisterer i tabell ProdA. Det samme gjelder ProductID = 11. Det finnes i tabellen ProdA, men ikke i tabellen ProdB.

utformingen-bånd

Ved å bruke Vis-knappen på båndet og bytte til SQL View, kan du se SQL-spørringen generert av designeren som ble brukt for å få disse resultatene.

VELG ProdA.ProductName, ProdB.ProductName FRA ProdA INNER JOIN ProdB PÅ ProdA.ProductID = ProdB.ProductID;

Gå tilbake til designvisning og endre sammenføyningstypen til 2 (VENSTRE YTRE). Kjør spørringen for å se resultatene.

left_outer_join

Som du kan se, er hver oppføring i tabell ProdA representert i resultatene, mens bare de i ProdB som har en matchende ProductID-oppføring i tabell ProdB vises i resultatene.

Tomområdet i ProdB.ProductName-kolonnen er en spesiell verdi (NULL) siden det ikke er en samsvarende verdi i tabellen ProdB. Dette vil vise seg viktig senere.

VELG ProdA.ProductName, ProdB.ProductName FRA ProdA VENSTRE BLI MEDLEM ProdB PÅ ProdA.ProductID = ProdB.ProductID;

Prøv det samme med den tredje typen sammenføyning (RIGHT OUTER).

right_outer_join

Resultatene viser alt fra tabell ProdB mens den viser tomme (kjent som NULL) verdier der ProdA-tabellen ikke har en samsvarende verdi. Så langt bringer dette oss nærmest de ønskede resultatene i leserens spørsmål.

VELG ProdA.ProductName, ProdB.ProductName FRA ProdA RETTEN BLI MED PÅ ProdA.ProductID = ProdB.ProductID;

Bruke funksjoner i en spørring

Resultatene av en funksjon kan også returneres som en del av en spørring. Vi ønsker at en ny kolonne kalt ‘Resultater’ skal vises i resultatsettet. Verdien vil være innholdet i kolonnen Produktnavn i tabellen ProdA hvis ProdA har en verdi (den er ikke NULL), ellers bør den tas fra tabellen ProdB.

Funksjonen Umiddelbar IF (IIF) kan brukes til å generere dette resultatet. Funksjonen tar tre parametere. Den første er en tilstand som må evalueres til en sann eller falsk verdi. Den andre parameteren er verdien som skal returneres hvis betingelsen er sann, og den tredje parameteren er verdien som skal returneres hvis betingelsen er usann.

Full funksjonskonstruksjonen for vår situasjon ser slik ut:

IIF (ProdA.ProductID er null, ProdB.ProductName, ProdA.ProductName)

Legg merke til at tilstandsparameteren ikke sjekker for likhet. En null verdi i en database har ikke en verdi som kan sammenlignes med noen annen verdi, inkludert en annen null. Med andre ord, ikke Null lik Null. Noen gang. For å komme forbi dette, sjekker vi i stedet verdien ved å bruke søkeordet 'Er'.

Vi kunne også brukt ‘Is Not Null’ og endret rekkefølgen på True and False-parameterne for å få samme resultat.

Når du legger dette inn i Query Designer, må du skrive inn hele funksjonen i feltet: felt. For å få den til å lage kolonnen ‘Resultater’, må du bruke et alias. For å gjøre dette, forord funksjonen med 'Resultater:' som det vises på følgende skjermbilde.

høyre ytre-alias-resultater-utformingen

Den tilsvarende SQL-koden for å gjøre dette vil være:

VELG ProdA.ProductName, ProdB.ProductName, IIF (ProdA.ProductID er null, ProdB.ProductName, ProdA.ProductName) AS Resultater FRA ProdA RETTEN BLI MED PRODB PÅ ProdA.ProductID = ProdB.ProductID;

Når vi kjører denne spørringen, vil den gi disse resultatene.

right_outer_with_aliased_results

Her ser vi for hver oppføring der tabellen ProdA har en verdi, den verdien gjenspeiles i Resultatkolonnen. Hvis det ikke er en oppføring i ProdA-tabellen, vises oppføringen fra ProdB i Resultater, som er nøyaktig hva leseren vår ba om.

For mer ressurser for å lære Microsoft Access, sjekk ut Joel Lee's Hvordan lære Microsoft Access: 5 gratis online ressurser Hvordan lære Microsoft Access: 5 gratis online ressurserMå du administrere en stor mengde data? Du bør se på Microsoft Access. Våre gratis studieressurser kan hjelpe deg med å komme i gang og lære ferdighetene til mer komplekse prosjekter. Les mer .

Bruce har lekt med elektronikk siden 70-tallet, datamaskiner siden begynnelsen av 80-tallet, og svarer nøyaktig på spørsmål om teknologi han ikke har brukt eller sett hele tiden. Han irriterer seg også ved å prøve å spille gitar.