Avatar billede kimsand Nybegynder
21. august 2014 - 08:39 Der er 12 kommentarer og
1 løsning

en mange til mange tabel..

Har et problem som i virkeligheden er helt grundlæggende tror jeg... Måske jeg ikke helt forstår hvordan det virker.

Jeg har lavet en mange til mange struktur.

TAB: DT_borgerstat
IDborgerstat  primærnøgle
fodselsdato
slutdato

TAB:DT_data
IDdata        primærnøgle
registrering
aktiv

TAB:ST_data
DT_borgerstat  primærnøgle
DT_data        primærnøgle

Derefter har jeg lavet relationerne, med en en til mange fra DT_borgerstat til ST_data og en en til mange fra DT_data til ST_data.

når jeg laver en forespørgsel med en AND altså jeg vil gerne finde de fodselsdatoer der har en eks. 2 konkrete registreringer samtidigt, så får jeg intet resultat..

men hvis jeg laver en forespørgsel med en OR altså jeg vil gerne finde de fodselsdatoer, der har 1 af de to registreringer, så får jeg resultat, som jeg skal.

hvordan kan det være jeg ikke får resultat på AND ?
Avatar billede kimsand Nybegynder
21. august 2014 - 08:55 #1
Min SQL ser sådan her ud

SELECT DT_borgerstat.fodselsdato, DT_data.registrering
FROM DT_data INNER JOIN (DT_borgerstat INNER JOIN ST_data ON DT_borgerstat.IDborgerstat = ST_data.DT_borgerstat) ON DT_data.IDdata = ST_data.DT_data
WHERE (((DT_data.registrering)="basisaktivering" And (DT_data.registrering)="Uden ydelse under forløb"));
Avatar billede fdata Forsker
21. august 2014 - 10:27 #2
Fordi konstruktionen:

WHERE (((DT_data.registrering)="basisaktivering" And (DT_data.registrering)="Uden ydelse under forløb"));

betyder: Giv mig alle poster, hvor registrering både er lig med "basisaktivering" og samtidig lig med "Uden ydelse under forløb" - og det er der jo ingen poster, der kan være.

Du må nok den tunge vej, f.eks. over to separate forespørgsler, som du så sammensætter:

SELECT DT_borgerstat.fodselsdato, DT_data.registrering
FROM DT_data INNER JOIN (DT_borgerstat INNER JOIN ST_data ON DT_borgerstat.IDborgerstat = ST_data.DT_borgerstat) ON DT_data.IDdata = ST_data.DT_data
WHERE DT_data.registrering="basisaktivering"

UNION

SELECT DT_borgerstat.fodselsdato, DT_data.registrering
FROM DT_data INNER JOIN (DT_borgerstat INNER JOIN ST_data ON DT_borgerstat.IDborgerstat = ST_data.DT_borgerstat) ON DT_data.IDdata = ST_data.DT_data
WHERE DT_data.registrering="Uden ydelse under forløb";
Avatar billede kimsand Nybegynder
21. august 2014 - 12:52 #3
Hej fdata, tak for dit svar :)

jeg troede min sql sagde alle de fodselsdatoer som har en registrering der indeholder både "basisaktivering" og "Uden ydelse under forløb".
Avatar billede kimsand Nybegynder
21. august 2014 - 12:58 #4
nej jeg omformulerer lige...

alle de fodselsdatoer som både har en registrering der hedder "basisaktivering" og en registrering der hedder "Uden ydelse under forløb"
Avatar billede fdata Forsker
21. august 2014 - 20:23 #5
Yep, og derfor mener jeg også at du skal finde det via 2 forespørgsler. Man kunne formulere det sådan her:

1. Giv mig alle fodselsdatoer med "basisaktivering"
2. Giv mig alle fodselsdatoer med "Uden ydelse under forløb"

... og kun i de tilfælde, hvor en fodselsdato findes i begge svar, er den interessant.
Avatar billede kimsand Nybegynder
22. august 2014 - 08:24 #6
okie.. jeg prøver lige...

det er nok også fordi jeg ikke er helt med på hvad union betyder....

Skal lige checke det ud på nettet :)
Avatar billede kimsand Nybegynder
25. august 2014 - 08:21 #7
kan stadig ikke helt få det til at virke..

Jeg bliver ved med at klø på :)
Avatar billede fdata Forsker
25. august 2014 - 13:32 #8
Hm. Så er jeg tilbage.
Jeg var vist lidt for hurtig sidst. Undskyld forvirringen.

Det nemmeste er nok, hvis du nedbryder opgaven i del-opgaver.

1. Find alle fodselsdatoer med "basisaktivering"
2. Find alle fodselsdatoer med "Uden ydelse under forløb"
3. Find alle, der optræder på begge lister

Ad 1) Opret en forespørgsel, f.eks. Q_Basis:
SELECT ST_data.DT_borgerstat
FROM DT_data
INNER JOIN ST_data ON DT_data.IDdata = ST_data.DT_data
WHERE DT_data.registrering="basisaktivering";

Ad 2) Opret en forespørgsel, f.eks. Q_Ydelse:
SELECT ST_data.DT_borgerstat
FROM DT_data
INNER JOIN ST_data ON DT_data.IDdata = ST_data.DT_data
WHERE DT_data.registrering="Uden ydelse under forløb";

Ad 3) Opret resultat-forespørgslen:
SELECT DT_borgerstat.fodselsdato
FROM (Q_Basis INNER JOIN Q_Ydelse ON Q_Basis.DT_borgerstat = Q_Ydelse.DT_borgerstat)
INNER JOIN DT_borgerstat ON Q_Ydelse.DT_borgerstat = DT_borgerstat.IDborgerstat;

Hvis du smider SQL-udtrykkene ind i forespørgselsdesigneren, bliver overblikket måske lidt bedre  ;O)
Avatar billede kjulius Novice
29. august 2014 - 14:05 #9
Er det ikke at lave det unødigt kompliceret?

Jeg vil tro, at det samme vil kunne opnås ved en lille omskrivning af den oprindelige forespørgsel, der joiner til DT_Data to gange og i udvælgelsen angiver forskelligt alias (de to DT_Data skal have nyt navn, da de ellers ikke kan refereres) i selektionen på status.

SELECT DT_borgerstat.fodselsdato, DT_data.registrering
FROM ((DT_borgerstat
INNER JOIN ST_data ON DT_borgerstat.IDborgerstat = ST_data.DT_borgerstat)
INNER JOIN DT_data AS DT_DATA1 ON DT_data1.IDdata = ST_data.DT_data)
INNER JOIN DT_data AS DT_DATA2 ON DT_data2.IDdata = ST_data.DT_data
WHERE (((DT_data1.registrering)="basisaktivering" And (DT_data2.registrering)="Uden ydelse under forløb"));
Avatar billede kjulius Novice
29. august 2014 - 14:52 #10
Jeg må hellere lige tilføje, at du bliver nødt til at ændre feltet DT_data.registrering til DT_data1.registrering (eller DT_data2.registerring) i SELECT statementet afhængig af hvad du vil vise.
Avatar billede kimsand Nybegynder
05. september 2014 - 12:55 #11
Hej tak til jer begge 2, Jeg beklager jeg ikke er vendt tilbage angående det her, men jeg er i den grad blevet sat på en anden opgave så jeg har ikke lige nu mulighed for at prøve det af i har foreslået, men jeg vender tilbage til det..

I mellemtiden kan i 2 så ikke indsende et svar hver, så i deler pointene ?
Avatar billede fdata Forsker
05. september 2014 - 18:31 #12
Et svar :O)
Avatar billede kimsand Nybegynder
12. september 2014 - 07:51 #13
Giver lige Kjulius et par dage mere ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester