15 - 03 - 2025
Main Menu
Who's online

We have 58 guests and no members online

Latest articles
Visitors
30777766
Today
Yesterday
This Week
This Month
Last Month
All days
3486
13974
57336
112614
209677
30777766

Old stories

Find persons who live in a specific country and...

User Rating:  / 0

Today we will start with a simple query that find all persons that live in "USA".

The query will be this:

WHERE Birthplace IN (SELECT Name from ata_locations where Country = 'USA')

This was really too easy so we jump to a more complex query, we will see how to find persons who are born in a specfic country and where the place has photos assigned and the photo is in a specific category and the person has not been married (just for practising make queries)

The query will be for example this:

WHERE Birthplace IN (SELECT Name from ata_locations where Country = 'Norway') and Birthplace IN (SELECT loc from ata_locationphoto where Photo IN (SELECT Name from ata_photos where Category like '%|Nature|%')) and PID NOT IN (SELECT pid1 from ata_marriages)

There might be other ways to get same result but this was the one who worked good for me. The result is a list of persons who are born in Norway and the place has a photo assigned that has category "Nature" and the person has not been married.

Another example (that must be run in the Advanced SQL window) to make a statestic of lastnames:

SELECT count(Lastname) AS N, Lastname from ata_persons GROUP BY Lastname ORDER BY 1 DESC

ie. AS N means the Column header text will be "N" and order by 1 DESC means it will be ordered by column 1 which is count(Lastname) and with the highest value at top

The output will be like this:

 228 Olsen
 154 Kjerstad
 153 Pedersen
 126 Johansen
 116 Lillejord
 113 Anderson
 110 Andersen
 100 Hansen
 100 Nilsen
 97 Reinfjell
 92 Nyland
 89 Larsen
 88 Denke
 88 Olsdatter
 87 Turmo
 84 Andersdatter
 72 Øyen

 

And for firstname statestic:

SELECT count(firstname) as N, firstname from ata_persons GROUP BY firstname ORDER BY 1 DESC, 2 ASC

Output will be like this:

N, Firstname

  81 Marit
  72 Anders
  57 Ole
  44 Lars
  41 Nils
  40 Peder
  38 x
  33 Anne
  33 Karen
  31 Per
  30 Beret
  29 Jon
  28 Hans
  27 Ane
  27 Ingeborg
  27 Johannes

 

Finne personer som giftet seg på et sted...

User Rating:  / 1

I dag skal vi se på hvordan vi lager en meny i personlisten og som finner personer som har giftet seg på et sted vi angir som parameter. Vi vil gjøre det litt annerledes enn vanlig for å forstå bedre hvordan menysystemet virker. Vi klikker knappen helt til høyre for SQL tekstboksen i personlisten "..." (hvis du har den aller siste versjonen som ble lastet opp 23-02-2013 må du velge Edit/SQL Queries i hovedvinduet) og så går vi helt til bunnen og lager en ny linje der vi skriver "Giftet seg i Dolstad Kirke" som Name og som Category skriver vi "MenuLocations" og som SQL setning skriver vi

WHERE pid IN(SELECT maleid FROM ata_families WHERE marriageplace = 'Dolstad Kirke')

så går vi bare til en annen linje for at den linjen vi lagde skal bli lagret og så lukker vi Queries og åpner Personlisten så skulle vi ha en ny meny på User Menu/Locations som heter "Giftet seg i Dolstad Kirke".

Når man  så klikker GO får man listet opp alle menn som har giftet seg i Dolstad Kirke men vi kan enkelt forandre det til å vise alle kvinner bare med å forandre maleid til femaleid i spørringen slik at den blir:

WHERE pid IN(SELECT femaleid FROM ata_families WHERE marriageplace = 'Dolstad Kirke')

Dette er ment å være et eksempel på hvordan man finner personer i personlisten som har giftet seg et bestemt sted og i praksis vil man vel ikke benytte personlisten men heller familelisten og der blir det mye enklere SQL setning som vil bli så enkel som:

Where marriageplace = 'Dolstad Kirke'

Men vi fortsetter i personlisten og nå vil vi finne personer som har giftet seg i regionen "Nordland" og vi skriver:

WHERE pid IN(SELECT maleid FROM ata_families WHERE marriageplace IN(SELECT Name from ata_locations where region = 'Nordland'))

Også her bytter vi bare ut maleid med femaleid for å finne kvinner. Fordi jeg kun har en region som heter Nordland i min database behøver jeg ikke å angi hvilket land det dreier seg om men hvis jeg hadde hatt en region i et annet land enn Norge med region Nordland og jeg kun var interessert i regionen Nordland i Norge så måtte jeg skrive:

WHERE pid IN(SELECT maleid FROM ata_families WHERE marriageplace IN(SELECT Name from ata_locations where country = 'Norway' AND region = 'Nordland'))

Man kan også bytte ut "=" med "Like" for å søke på wildcards som f.eks Like '%Nord%'.

 

Disse spørringene må kjøres fra personlisten som er slik konstruert at bare den siste delen av den komplette SQL spørringen er tilgjengelig for redigering. (WHERE delen). Det er mulig jeg kommer til å forandre dette slik at man kan skrive komplette SQL spørringer også for personlisten. Men la oss gå til Advanced SQL vinduet og skrive en komplett spørring som vil returnere alle ekteskap og sortert på sted for bryllupet. Den blir som for eksempel:

SELECT fid, femaleid AS IDF, femalename AS FEMALE, malename AS MALE, maleid AS IDM, MarriagePlace AS 'Place of marriage' FROM ata_persons JOIN ata_families ON(femaleid = pid) ORDER BY marriageplace ASC, pid

AS FEMALE betyr at teksten som vises over kolonnen blir rett og slett FEMALE man kan endre det til hva man vil... men bruker man flere ord må man sette ' ' rundt f.eks 'NAME OF WOMAN'.

Til slutt (for denne gang) vil jeg vise hvordan man kan leke litt med SQL spørringer i Advanced SQL vinduet. La oss skrive:

SELECT firstname from ata_persons where pid in
(SELECT pid from ata_persons where fatherid in
(SELECT pid from ata_persons where fatherid in
(SELECT pid from ata_persons where fatherid =
(SELECT fatherid FROM ata_persons where pid = '1'))));

Ikke spør hva dette gjør men "where pid = 1" vil returnere min far og resultatet av spørringen er fornavnet til min sønn.

Her er noen flere eksempler:

(pid = 1 er min far og pid = 2 er min mor)

*********************************************************
select firstname from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '1'))));

*********************************************************
Returnere alle barn av mine søskens og mine barn (hvis jeg var kvinne) hvor mine søsken er kvinner
Thomas
Daniel
Anette
Mathias
Mia
Leah
*********************************************************
*************************************************************************
select firstname from ata_persons where motherid in
(select pid from ata_persons where fatherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '1')));

*************************************************************************
Returnerer alle barn av mine søsken fordi jeg kun har kvinner som søsken
Trond
Heidi
Tone
Guro
Silje
Marthe
Andreas
*************************************************************************
********************************************************
select firstname from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '1')));

********************************************************
Returnere alle barn av mine tanters barn
Liv
Rune
Hanne
********************************************************
***********************************************************************
select firstname from ata_persons where fatherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '1'))));

***********************************************************************
Returnere alle barn av mine søskens barn hvor mine søskens barn er menn
Ida-Marie
Sandra
Andrea
***********************************************************************
******************************************************
select firstname from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '1'))));

******************************************************
Returnerer alle barn av mine tanters barn hvor mine tanters barn er kvinner
Håvard
******************************************************
******************************************************************
select firstname from ata_persons where fatherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '1'))));

******************************************************************
Returnerer alle barn av mine tanters barn hvor mine tanters barn er menn
Mariell
******************************************************************

Man kan også bruke UNION for å slå sammen to utvalg i samme spørring:

For eks:

***********************************************
select firstname from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '2')))) UNION
select firstname from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '1'))))
***********************************************
Returnerer barn av nieser på begge sider
Thomas
Daniel
Anette
Håvard
Vendelin
Kasper
Mikael
Mathias
Mia
Leah
***********************************************

Man skulle kanskje tro at man kunne istedet for å bruke UNION bare si where pid = 2 OR pid = 1, men dette gir ikke samme resultat og jeg har ikke i farten noen god forklaring på hvorfor ikke dette går.

For å finne barn av både nieser og nivøer + kusiner 2 ganger forskjøvet på mor og far-side blir det da:

select firstname from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '2')))) union
select firstname from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '1')))) union
select firstname from ata_persons where fatherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '2')))) union
select firstname from ata_persons where fatherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where motherid in
(select pid from ata_persons where fatherid =
(select fatherid from ata_persons where pid = '1'))))
***********************************************

Som returnerer i min base:

Thomas
Ida-Marie
Sandra
Daniel
Anette
Håvard
Elisabeth
Vendelin
Kasper
Mikael
Mariell
Mathias
Andrea
Mia
Leah
***********************************************

Vel, ikke alle vil bli funnet, man må nok dobble antall unioner et par ganger til og veksle på Where motherID/fatherID for at absolutt alle personer skal bli funnet, men det er likevel interessant og morsomt å teste ut denne muligheten i SQL. AgetoAgeSqlite bruker ikke denne teknikken for å finne etterkommere men bruker også SQL spørringer men på en mer oversiktelig måte Les mer her. Dette er ment som en ekstra mulighet og som kan være en grei avkobling når man har tid å utforske litt. Hvis noen finner en bedre måte å skrive slike SQL spørringer på håper jeg på tilbakemelding.

Her er et til eksempel som returnerer 74 personer fra min database:

********************************************************************

select pid, firstname || ' ' || lastname as Name from  ata_persons where fatherid in (
select PID from ata_persons where fatherid > '-1' and fatherid in
(select fatherid from ata_persons where fatherid > '-1' and pid in
(select fatherid from ata_persons where  pid = '1')) union
select PID from ata_persons where fatherid > '-1' and fatherid in
(select fatherid from ata_persons where fatherid > '-1' and pid in
(select motherid from ata_persons where pid = '1'))) union
select pid, firstname || ' ' || lastname as Name from  ata_persons where motherid in (
select PID from ata_persons where  fatherid > '-1' and fatherid in
(select fatherid from ata_persons where fatherid > '-1' and  pid in
(select fatherid from ata_persons where pid = '1')) union
select PID from ata_persons where fatherid > '-1' and fatherid in
(select fatherid from ata_persons where fatherid > '-1' and pid in
(select motherid from ata_persons where pid = '1')))
union
select pid, firstname || ' ' || lastname as Name from  ata_persons where fatherid in (
select PID from ata_persons where fatherid > '-1' and fatherid in
(select fatherid from ata_persons where fatherid > '-1' and pid in
(select fatherid from ata_persons where pid = '2')) union
select PID from ata_persons where fatherid > '-1' and fatherid in
(select fatherid from ata_persons where fatherid > '-1' and pid in
(select motherid from ata_persons where pid = '2'))) union
select pid, firstname || ' ' || lastname as Name from  ata_persons where motherid in (
select PID from ata_persons where  fatherid > '-1' and fatherid in
(select fatherid from ata_persons where fatherid > '-1' and  pid in
(select fatherid from ata_persons where pid = '2')) union
select PID from ata_persons where fatherid > '-1' and fatherid in
(select fatherid from ata_persons where fatherid > '-1' and pid in
(select motherid from ata_persons where pid = '2')))

*********************************************************************************

Her tester jeg for en fatherid eller motherid med verdi -1, denne verdien er for personer som ikke har registrert far eller mor og i såfall er de ikke aktuelle i denne spørringen.

En ny oppdatering hvor dette siste eksemplet er inkludert og som finnes på Advanced SQL's User menu/Example of finding relatives er lastet opp. (12-februar-2013).

16-februar-2013 - Lekingen med SQL setninger førte til at jeg fant en fin måte å finne alle oldebarn på og utvidet Personskjemaet slik at man kan lage spørringer også her som finnes på fanen "User defined". Ved opprettelse av ny database blir denne funksjonen automatisk lagt til men man kan godt legge den til manuelt i eksisterende databaser og her er spørringen for oldebarn man vil skrive:

select pid, firstname || ' ' || lastname as Name, Birthplace, Birthdate from ata_persons where fatherid in (
select pid from ata_persons where fatherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid))
union
select pid, firstname || ' ' || lastname as Name, Birthplace, Birthdate from ata_persons where fatherid in (
select pid from ata_persons where motherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid))
union
select pid, firstname || ' ' || lastname as Name, Birthplace, Birthdate from ata_persons where motherid in (
select pid from ata_persons where fatherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid))
union
select pid, firstname || ' ' || lastname as Name, birthplace, birthdate from ata_persons where motherid in (
select pid from ata_persons where motherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid))

Man kan selvsagt selv bestemme hvilke felt man vil vise.....her har jeg valgt å slå sammen fornavn og etternavn til Name og så har jeg lagt inn Birthplace og Birthdate men dette er helt opp til brukeren å bestemme. Det eneste som kreves er at det første feltet skal være PID. Funksjonen skal jo fungere med alle personer som subjekt i personskjemeat så derfor må det brukes et parameter @pid som programmet finner verdi for ved kjøring og derfor må man alltid bruke @pid, et lite enkelt eksempel....man ønsker å vise birthdate for personen som er subjekt på personskjemaet...og skriver en spørring for dette, den vil da se slik ut:

Select PID, Birthdate from ata_persons where PID = @pid

Når programmet kjører vil @pid bli byttet ut med verdien for PID for subject på personskjemaet. Men husk at dette med @pid gjelder bare for spørringer som kjøres fra personskjemaet. Man kan ikke kjøre en slik spørring fra f.eks. personlisten. (men ikke farlig å gjøre det om man absolutt vil prøve).

VIKTIG! Man må sette Category i Queries vinduet til "PShemaStandard" eller i hvertfall må den begynne med "PShema" for at funksjonen skal bli tilgjengelig på personskjemaet, og man må selvsagt skrive et navn på spørringen. f.eks "Oldebarn".

Man kan lage og lagre flere spørringer med å klikke "..." på høyresiden av nedtrekkslisten over brukerfunksjoner og bare å velge "Save as new...", men husk å forandre navn for spørringen først.

Dette systemet åpner for at brukere kan utvikle sine egne SQL spørringer og dele med andre brukere om dem vil. Også andre tabeller enn person tabellen kan inkluderes i spørringen, slik at det faktisk er mulig å skrive en spørring for personskjemaet som også vil vise kolonner som hører til andre tabeller f.eks tabellen over "steder" kan også inkluderes. Et lite eksempel:

select pid, firstname, lastname, Country, Region from ata_persons join ata_locations on birthplace = Name and pid = @pid

Dette vil vise 2 kolonner (Country og Region) på personskjemaet som slett ikke hører til person tabellen.

Okay god slektsforskning!

*************************************************

19-februar-2013 - Jeg måtte selvfølgelig også lage en SQL setning som returnerer alle oldebarnebarn også og den var virkelig artig å ha som "User defined" funksjon på personskjemaet og her er den:

select PID, firstname || ' ' || lastname as Name, Birthplace, Birthdate from ata_persons where fatherid in (
select pid from ata_persons where fatherid in(
select pid from ata_persons where fatherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid)))
union
select pid, firstname || ' ' || lastname as Name, birthplace, birthdate from ata_persons where fatherid in (
select pid from ata_persons where motherid in(
select pid from ata_persons where fatherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid)))
union
select pid, firstname || ' ' || lastname as Name, birthplace, birthdate from ata_persons where motherid in (
select pid from ata_persons where fatherid in(
select pid from ata_persons where fatherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid)))
union
select pid, firstname || ' ' || lastname as Name, birthplace, birthdate from ata_persons where motherid in (
select pid from ata_persons where motherid in(
select pid from ata_persons where fatherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid)))
union
select pid, firstname || ' ' || lastname as Name, birthplace, birthdate from ata_persons where fatherid in (
select pid from ata_persons where fatherid in(
select pid from ata_persons where motherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid)))
union
select pid, firstname || ' ' || lastname as Name, birthplace, birthdate from ata_persons where fatherid in (
select pid from ata_persons where motherid in(
select pid from ata_persons where motherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid)))
union
select pid, firstname || ' ' || lastname as Name, birthplace, birthdate from ata_persons where motherid in (
select pid from ata_persons where fatherid in(
select pid from ata_persons where motherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid)))
union
select pid, firstname || ' ' || lastname as Name, birthplace, birthdate from ata_persons where motherid in (
select pid from ata_persons where motherid in(
select pid from ata_persons where motherid in(
select pid from ata_persons where fatherid = @pid or motherid = @pid))) 

 

Alle ekteskap

User Rating:  / 0

Vi vil nå lage en meny for å finne alle ekteskap i personlisten og vi går da bare til personlisten og klikker "..." knappen helt til høyre for SQL boksen. (må ha siste versjon av AgetoAgeSqlite) Vi skriver f.eks "Alle Ekteskap" som Name som Category kan vi f.eks skrive "Familie" og som CMD eller SQL spørrring skriver vi:

select pid, fid, firstname || ' ' || lastname as Name, CASE WHEN pid = maleid THEN femalename ELSE malename END as Married, marriagedate, marriageplace from ata_persons join ata_families where maleid = pid or femaleid = pid order by pid

Så velger vi File/Save as new... og vips så har vi fått en ny meny User menu/Familie/Alle ekteskap som vi bare velger og klikker GO.

Problemet er vel å skrive SQL spørringer men det er slett ikke så vanskelig og man finner masse stoff om dette på nettet og øvelse gjør mester. Det er vel ikke alle som har erfaring med SQL spørringer (AgetoAgeSqlite bruker SQLite database system så spørringene må være kompatible med SQLite) men mange har sikkert noen som kan hjelpe. Man har oversikt over alle tabellene som kan brukes i vinduet "SQL Command Builder" i AgetoAgeSqlite, jeg har enda ikke fått tid til å publisere noen oversikt over hvordan feltene hører sammen (hvilke felt som er primærnøkler, f.eks) men det er bare å sende meg en mail hvis noen skulle ha behov for hjelp. Og det er slett ikke risikabelt å eksprimentere, SQLite hånderer feil i spørringene og man risikerer ikke å ødelegge noen tabeller pga eventuelle feil i spørringene man skriver så lenge man kun bruker rene SELECT setninger som er meningen her, det er mulig å skrive en SQL spørring som oppdaterer tabellene men det er ikke så lurt å prøve på hvis man ikke har litt peiling, men begynner man med SELECT og holder seg unna UPDATE spørringer er det ingen fare.

Lastname statestikk

User Rating:  / 0

Vi skal i dag se på hvordan vi med enkle SQL spørringer kan lage enkle statestikker for navn og andre ting f.eks fødselssted. Vi vil bruke Advanced SQL vinduet i AgetoAgeSqlite. For å få telt opp hvor mange vi har av hvert etternavn så skriver vi følgende SQL spørring:

select count(lastname) as N, lastname from ata_persons group by lastname order by 1 desc, 2 asc

count() er en funksjon som teller elementer angitt i parentesen, 1 desc betyr at den første kolonnen blir sortert synkende (største verdi øverst) og 2 asc betyr at andre kolonne blir sortert stigende, vi kan altså sortere flere kolonner på en gang og sortering av andre kolonne skjer når kolonne 1 har flere elementer med samme verdi

Eksempel på output av kjøring av denne SQL spørringen:

Vil man så ha en statestikk på fornavn er det bare å skrive firstname istedet for lastname der hvor lastname er i spørringen og vil man lage statestikk over hvor mange ganger et sted er oppført som fødested for en person så er det bare å bytte ut lastname med birthplace.

God førnøyelse! Husk at spørringene kan lagres med SQL Command Builder (velg file/save as new.... etter at man har angitt et navn for spørringen). Da vil disse spørringene dukke opp som undermenyer på "User menu" neste gang man åpner Advanced SQL vinduet.

 

Show photofield

User Rating:  / 1

Vi skal se på hvordan vi kan lage en liste over personer som også vil vise eventuelle fotoer ved dobbelklikk på feltet. Vi lager en ny spørring som f.eks:

select ata_persons.pid, firstname ||' '|| lastname as Name, Birthdate, Birthplace, Deathdate, Deathplace, CommLength  as Note, ata_photos.Name as Photo, Registerdate as Reg from ata_persons join ata_photos, ata_personphoto
on(ata_persons.PID = ata_personphoto.PID and ata_photos.Name = ata_personphoto.Photo)
order by ata_persons.pid

somharfoto

Lagrer den og klikker "Test SQL and set actions" i SQL Command Builder og kommer til Set Query Actions:

Her er det tabellen til høyre vi vil sette hvilket skjema som skal komme opp ved dobbelklikk i listen som blir generert av spørringen. Man kan skrive verdier direkte inn i listen og vi skriver Photo for Schema og setter Key til verdien 7 og når vi så presser opppil eller nedpil på tastaturet vil endringen bli lagret. På de kolonner hvor vi vil vise personskjemaet ved dobbelklikk skriver vi verdien 0 for Key fordi PID har kolonneindeks 0. (PID er Primærkey for tabellen ata_persons)