28. november 2008 - 00:30Der er
9 kommentarer og 1 løsning
Samle den nyeste detail-record med master-recorden
Givet tabellerne:
Borger ID: integer identity(1,1) ...
Datoer ID: integer identity(1,1) Dato: datetime not null
Jeg leder efter den smukkeste måde at hente den nyeste record fra datoer-tabellen og lægge den sammen med borger-tabellen. Skal jeg lave søgninger er det altid den nyeste detail-record jeg skal kigge på
Har leget lidt med dette:
select b.ID from borger b join datoer d on (d.ID = (select top 1 ID from datoer where borger_ID = b.ID) and status = :status)
.. men det er ikke smukt og det er garanteret heller ikke hurtigt.
Jeg leder efter den smukkeste/optimale løsning på dette problem for jeg har rodet mig ud i den slags situationer en del gange. Måske findes spørgsmålet allerede besvaret, men jeg ved ikke hvad jeg skal søge efter.
For hver record i borger vil jeg også gerne have den nyeste record i borgerdatoer der refererer til borgeren, men altid så jeg kun har en record pr. borger.
SELECT b.id,b.navn,bd.fra_dato,bd.til_dato FROM borger b,borgerdatoer bd,(SELECT borger_id,MAX(fra_dato) AS max_fra_dato FROM borgerdatoer GROUP BY borger_id) x WHERE b.id=bd.borger_id AND b.id=x.borger_id AND bd.fra_dato=x.max_fra_dato
Mit indslag blev skrevet i databasen. Fik ellers en "Beklager men vi opdaterer om natten" besked og troede alt var mistet. Plejer at kopiere til klippebord før jeg submitter, grundet den slags "morsomheder"
Jeg synes ikke det er meget pænere end det jeg selv har brygget sammen (men som jeg altså synes er lidt langsom). Kan ikke bedømme om en "group by" eller en "top" i sub-selecten er bedst.
... from borger b join borgerdatoer bd on (bd.ID = (select top 1 ID from borgerdatoer where (borger_ID = ba.ID) order by fra_dato desc)
and (til_dato is null or til_dato >= getdate())) // Aktive .. eller and til_dato is not null) // Henlagte
Endnu er hastigheden en ubetydelig faktor, men når tiden går kan det blive aktuelt at optimere. Måske skal jeg bare registrere den aktuelle records ID i borger-tabellen? Så var det en singleton select... Har alligevel tænkt mig at proppe gemme operationen ned i en SP.
Jeg lærte i skolen, at når databasen endte i 3 normalform eller deromkring, burde man overveje at genindføre redundans for bedre ydelse. Det var ikke meget jeg fangede dengang (oveni kærstesorger, nær mikrobankerot og generel kedsomhed), men lidt hænger da ved.
Det sker at det er nødvendigt. Men det er ret sjældent til generelle databaser. Ofte vil fornuftig brug af indexes få det til at fungere. Hvis man har brug for hårdhændede metoder, så er et materialized view ofte bedre end en denormaliseret tabelstruktur. Men det sker at det bliver brugt.
Synes godt om
Ny brugerNybegynder
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.