Er kommet til dette script der tilsyneladende giver mig korrekte resultater.
select id, sags_id, fra_dato, til_dato from sagsdatoer where (id in (select max(skd.id) from sagsdatoer sd join sags s on (s.id = sd.sags_id) where (s.borger_id = :borger_id) group by s.id))
Spørgsmålet er stadig åbent. Er der en anden tilgang?
Hej Arne. TOP er der naturligvis men er den pænere/mere effektiv? Jeg bruger den aldrig da jeg mistænker den for at være en ydelsesdræber; også i forhold til sub-selects. Nogle gange må den hente en masse data for at kunne sortere den og derefter kun udvælge TOP'pen. Her sorterer den på primærnøglen og det er nok hurtigt.
Grunden til jeg lægger det ud til forum (igen?) er, at det må være noget mange har brug for at gøre. Løsningerne her er ikke gode i en select hvor man eksempelvis vil søge borgere med åbne sager.
Som antydet ovenfor kan jeg ikke se om spørgsmålet allerede er blevet stillet af mig; dvs. bladrer jeg gennem alle mine "posts" så finder jeg det nok, men tidligere kunne man filtrere på spørgsmål oprettet af en selv.
Jeg har også spurgt om man kunne måle ydelsen af en "select" i MSSQL - og det kan man, men jeg kan ikke hitte spørgsmålet.
(Jeg synes det er lidt svært at vænne sig til den ny "Ekspert")
Kan du ikke komme med lidt mere info? I din beskrivelse har du både en tabel sagsdatoer og en tabel der hedder sags, men du har ikke beskrevet dem begge. Og hvis du så kan komme med et lille test-data sæt, hvor du så fortæller hvad det forventede output er - så er der lidt større chancer for at få hjælp.
Kører du sql server 2005? For så er jeg næsten 100% sikker på at en cte med brug af row_number() funktionen kan hjælpe med at løse det.
Mens jeg venter på lidt mere info, så kan jeg da lige komme med et par kodestumper som jeg har lavet ud fra din første beskrivelse: "Sidste record tilknyttet sagen angiver dens status. Hvis "til_dato"'en er udfyldt, er den afsluttet. Er den tom (NULL) er den åben"
with Sager as ( select ROW_NUMBER() over (partition by sags_id order by id desc) as rn, * from sagsdatoer )
select * from Sager where rn = 1 and til_dato is null
Ovenstående vil returnerer den nyeste oprettede row pr. sags_id. Og så bortfiltreres alle de sags_id'er, hvor den nyeste tilknyttede sagsdato ER blevet afsluttet. H Men om det er noget i den stil du er ude efter at få, er jeg altså ikke helt sikker på.
sjang: Der er en sagsdatoer-tabel som hænger på et sags-tabel. Sags-tabellen hænger på en borger-tabel. (sagsdatoer.sags_id -> sags.id, sags.borger_id -> borger.id). Jeg er kun interesseret i den nyeste sagsdatoer-record for hver sag en borger må have.
Umiddelbart lige ud ad landevejen skulle jeg mene.
arne: Jeg sammenlignede vores løsninger med følgende resultat:
.. altså noget tungere at udføre. Jeg fik vist ret mht. TOP. I øvrigt ikke stor forskel om man brugte * eller valgte felterne. Med asterix i selected var AvgRowSize 366 og der kom en deloperation mere på. Resultatet var næsten det samme.
Arne og Sjang. Jeg lukker nu. Fik ikke strikket et script sammen der var bedre end det jeg havde, men fik nogle rigtig gode tips til at måle på eksperimenterne. Derfor må I dele pointsene.
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.