21. juli 2008 - 11:15Der 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.
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)
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
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.
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.