Opbygning af kompleks SQL...Lidt hjælp
Hej eksperter.Jeg er ved at prøve at stykke en reltiv kompleks SQL sammen der skal kunne udvælge den nyeste række fra en tabel.
Scenariet er følgende:
Jeg laver et system der logger alle ændringer fra en tabel i en anden database. Denne tabel indeholder nogle blobs og andre reltivt store datastrukturer, som derfor gør at jeg er nødt til at optimere pladsbesparelsen lidt.
Derfor har jeg en tabel der bliver opdateret hver nat(natlig backup).
Hvis jeg kan se at en række er ændret i tabellen i den anden database, i forhold til den nyeste i backup-tabellen skal jeg altså så gemme de ændringer der er foretaget.
Det vil altså sige at på den første række i tabellen vil alle kolonner være fyldt eftersom at det ligesom er der backuppen blev initieret. De efterfølgende rækker vil være fragmenteret således at der i hver kolonne er gemt null hvis der ingen ændring var i kolonnen, og hvis der var en ændring ligger den nye værdi der så.
Ergo får jeg altså en tabel af nogenlunder det udseende jeg har prøvet at tegne i nedestående ascii-tabel :)
---------------------------------------------------------
| val1 | val2 | val3 | val4 |timestamp1|
---------------------------------------------------------
| | val2.1 | | |timestamp2|
---------------------------------------------------------
| | | val3.1 | |timestamp3|
---------------------------------------------------------
| | | | val4.1 |timestamp4|
---------------------------------------------------------
| | | val3.2 | |timestamp5|
---------------------------------------------------------
| val1.1 | val2.2 | | val4.2 |timestamp6|
---------------------------------------------------------
| val1.2 | | | val4.3 |timestampn|
---------------------------------------------------------
Udfordringen er nu at stykke den nyeste række sammen fra en given dato. Jeg vil altså prøve at lave en funktion der ud fra en bestemt dato kan generere den nyeste række fra den dato.
Så hvis jeg fx. vil have rækkens state fra datoen timestamp3 vil jeg have sammenstykket en række der ser således ud
---------------------------------------------------------
| val1 | val2.1 | val3.1 | val4 |timestamp3|
---------------------------------------------------------
Der er altså noget i retningen af :
Find nyeste række i hver kolonne forskellig fra null fra medsendte dato op til begyndelse.
Problemet er altså at det ud fra det SQL jeg kender til er svært at lave noget der er smart som kan klare det her problem.
Man kunne selvfølgelig tage en kolonne ad gangen og sige
select nyeste fra kolonne1 != null,select nyeste fra kolonne2 != null,select nyeste fra kolonne_n != null...
Det bliver dog en gigantisk SQL da jeg har op mod 140 kolonner i tabellen. Så jeg håbede lidt på at man kunne gøre det lidt smartere.
Og det er så her jeg skal bruge jeres hjælp :)
Hvis nogle har en knaldgod måd at håndtere det her problem på ville det være superfedt at høre om den. Jeg har sat 60 point af til det her spørgsmål da jeg selv synes det er ret vanskeligt. Så jeg håber på svar snart :)
Mange hilsner fra Force Programmer.
NB! Jeg skriver jeg gerne mere udførligt hvis jeg ikke har forklaret problemstillingen godt.