Avatar billede jmp.dk Nybegynder
21. juli 2008 - 11:15 Der er 6 kommentarer og
1 løsning

Query for View

Jeg har en tabel APPOINTMENTS der viser klient aftaler, som (simplificeret) har dette layout.

Client_ID INT
StartDate DateTime
EndDate DateTime
Subject varchar(128)

Jeg skal lave et view der viser alle aftaler og om hver specifik aftale er den foerste aftale for klienten eller ej.

Denne Query viker:
select a.id,
CASE WHEN (Select count(id) from APPOINTMENTS s where s.client_id = a.client_id and s.starttime < a.starttime ) < 1 THEN "New" ELSE "REVIEW" END AS STATUS
From appointments a

Men da der er over 2 millioner records i tabellen er den ret "Tung".
Er der nogen der kan komme op med en query der er mindre resource kraevende.
Det er ikke muligt at tilfoeje en kolonne i tabellen og evt. triggers, da det ikke er min database.
Avatar billede teepee Nybegynder
21. juli 2008 - 11:35 #1
Du behøves jo ikke at tælle dem allesammen, prøv at omskrive til noget WHERE EXIST ( select 1 from APPOINTMENTS s where s.client_id = a.client_id and s.starttime < a.starttime)
Avatar billede teepee Nybegynder
21. juli 2008 - 11:36 #2
der mangler vist et s i existS
Avatar billede aaberg Nybegynder
21. juli 2008 - 11:47 #3
Dette burde være en del hurtigere:

select a.client_id, case when a.StartDate = b.minDate then 'New' else 'Review' end as status
from appointments a
inner join (
    select a2.Client_ID, Min(a2.StartDate) minDate
    from appointments a2
    group by Client_id ) b on a.Client_id = b.Client_id
Avatar billede jmp.dk Nybegynder
21. juli 2008 - 11:47 #4
Ja da teepee det er genialt!!
Forbedring paa 30%.
Nogen der kan slaa den?
Avatar billede jmp.dk Nybegynder
21. juli 2008 - 12:45 #5
aaberg Din loesning er ogsaa genial.
Kan ikke lige gennemskue hvilken der er sundest for databasen paa laengere sigt.
Avatar billede teepee Nybegynder
21. juli 2008 - 14:35 #6
Når du nu ikke har mulifhed for at ændre i tabellen, så må jeg lige spørge dig
Er der index på client_id og på startdate? Hvis der ikke er på startdate, så vil den nok blive ved at trække tænder ud. Er der evt. en unique primærnøgle i form at et løbenummer på tabellen. Under antagelse af at dette er nogenlunde fortløbende uden genbrug af gamle numre kunne en omskrivning til at se på løbenumre mindre et det som du står med være en mulighed i setdet for startdate.
Avatar billede teepee Nybegynder
21. juli 2008 - 14:36 #7
hold da op hvor kan jeg lave mange stavefejl :-)
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