Avatar billede ae03 Novice
20. august 2010 - 11:26 Der er 1 kommentar og
1 løsning

Distinct udtræk med full join

Jeg har to tabeller A og B, fra hvilke jeg skal udtrække variablene A.x, B.x, A.y, B.y, A.z, B.z med en join baseret på A.CPR og B.CPR.
I både A og B er der CPR, som ikke findes i den anden tabel, og i B er der mange CPR, som er med flere gange. Jeg skal bruge alle unikke CPR fra såvel A som B (full join), men hvert af dem kun en gang. Fra B vil jeg helst have den seneste registrering (B.dato), men det er ikke afgørende.
Jeg kan ikke lige her og nu gennemskue, hvordan jeg skruer den sammen, og jeg skal stort set bruge det nu, så der er 100 point til den, der kan levere en funktionsdygtig løsning inden kl. 12.
20. august 2010 - 12:10 #1
Ikke til klokken 12 og ikke med FULL JOIN fordi jeg bruger MYSQL og der skal man bruge LEFT JOIN og UNION og RIGHT JOIN, men her er en loesning.  Jeg lavede for test nedenstaaende to tabeller og fyldte data i og med denne query fik jeg det forventede resultat, alle CPRs i A, alle CPRs i B kun en gang hver med den nyeste registrering:

SELECT a.CPR, b.CPR, a.x, a.y, b.x, b.y FROM ae03A a LEFT JOIN (SELECT CPR, x, y, MAX(dato) FROM ae03B GROUP BY CPR) b ON a.CPR = b.CPR
UNION
SELECT a.CPR, b.CPR, a.x, a.y, b.x, b.y FROM ae03A a RIGHT JOIN (SELECT CPR, x, y, MAX(dato) FROM ae03B GROUP BY CPR) b ON a.CPR = b.CPR

med dette resultat (jeg inkluderede CPRerne for at demonstrere resultatet):

 
CPR  CPR  x  y  x  y 
CPR1 CPR1 x1 y1 x11 y11
CPR2 CPR2 x2 y2 x12 y12
CPR3 CPR3 x3 y3 x15 y15
CPR4 CPR4 x4 y4 x16 y16
CPR5 NULL x5 y5 NULL NULL
CPR6 NULL x6 y6 NULL NULL
CPR7 NULL x7 y7 NULL NULL
CPR8 NULL x8 y8 NULL NULL
CPR9 NULL x9 y9 NULL NULL
CPR10 NULL x10 y10 NULL NULL
NULL CPR11 NULL NULL x19 y19
NULL CPR12 NULL NULL x20 y20

Her er mine tabeller og data:

CREATE TABLE ae03A(CPR VARCHAR(10), x VARCHAR(5), y VARCHAR(5));

CREATE TABLE ae03B(CPR VARCHAR(10), x VARCHAR(5), y VARCHAR(5), dato DATE);

INSERT INTO ae03A VALUES('CPR2', 'x2', 'y2');
INSERT INTO ae03A VALUES('CPR3', 'x3', 'y3');
INSERT INTO ae03A VALUES('CPR4', 'x4', 'y4');
INSERT INTO ae03A VALUES('CPR5', 'x5', 'y5');
INSERT INTO ae03A VALUES('CPR6', 'x6', 'y6');
INSERT INTO ae03A VALUES('CPR7', 'x7', 'y7');
INSERT INTO ae03A VALUES('CPR8', 'x8', 'y8');
INSERT INTO ae03A VALUES('CPR9', 'x9', 'y9');
INSERT INTO ae03A VALUES('CPR10', 'x10', 'y10');

INSERT INTO ae03B VALUES('CPR2', 'x12', 'y12', '2010-01-02');
INSERT INTO ae03B VALUES('CPR2', 'x13', 'y13', '2010-01-03');
INSERT INTO ae03B VALUES('CPR2', 'x14', 'y14', '2010-01-04');
INSERT INTO ae03B VALUES('CPR3', 'x15', 'y15', '2010-01-05');
INSERT INTO ae03B VALUES('CPR4', 'x16', 'y16', '2010-01-06');
INSERT INTO ae03B VALUES('CPR4', 'x17', 'y17', '2010-01-07');
INSERT INTO ae03B VALUES('CPR4', 'x18', 'y18', '2010-01-08');
INSERT INTO ae03B VALUES('CPR11', 'x19', 'y19', '2010-01-09');
INSERT INTO ae03B VALUES('CPR12', 'x20', 'y20', '2010-01-10');
Avatar billede ae03 Novice
20. august 2010 - 13:28 #2
En såre simpel og "smuk" løsning, som absolut ser ud til at ville virke. Jeg har ikke testet den på egne data, da jeg lige skal have et par andre joins ind over for at danne tabel a. Det bliver først mandag, for nu haster det ikke længere helt så meget.

Selv om det ikke var inden min haste-deadline kl. 12, får du pointene, for jeg kan stadig bruge løsningen, og så slipper jeg for at bruge et tid i weekenden på at udvikle den selv.

Tak for hjælpen og god weekend.

Lars
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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