Avatar billede forceprogrammer Nybegynder
22. juli 2006 - 10:57 Der er 1 kommentar

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.
Avatar billede pgroen Nybegynder
24. juli 2006 - 08:19 #1
Umiddelbart ville jeg overveje, om datamodellen kunne ændres til noget i stil med:



valtype        val      timestamp
------------------------------------
        1 |        1 | timestamp1 |
------------------------------------
        2 |        2 | timestamp1 |
------------------------------------
        3 |        3 | timestamp1 |
------------------------------------
        4 |        4 | timestamp1 |
------------------------------------
        2 |      2.1 | timestamp2 |
------------------------------------
        3 |      3.1 | timestamp3 |
------------------------------------
        4 |      4.1 | timestamp4 |
------------------------------------
        3 |      3.2 | timestamp5 |
------------------------------------
        1 |      1.1 | timestamp6 |
------------------------------------
        2 |      2.2 | timestamp6 |
------------------------------------
        4 |      4.2 | timestamp6 |
------------------------------------
        1 |      1.2 | timestampn |
------------------------------------
        4 |      4.3 | timestampn |
------------------------------------

(Der skal måske lidt flere kolonner på, en for hver datatype, men for overskuelighedens skyld...)

Under alle omstændigheder, så VIL du få et kompliceret (læs: langt) statement, hvis du virkelig har 140 kolonner




Ved nærmere eftertanke kunne et mere elegant approach være følgende, hvor man for hvert timestamp kan finde den 'gældende' værdi for alle kolonner :

tabel1
---------------------------------------------------------
|  val1    |  val2    |  val3    |  val4    | id1      |
---------------------------------------------------------
|          |  val2.1  |          |          | id2      |
---------------------------------------------------------
|          |          |  val3.1  |          | id3      |
---------------------------------------------------------
|          |          |          |  val4.1  | id4      |
---------------------------------------------------------
|          |          |  val3.2  |          | id5      |
---------------------------------------------------------
|  val1.1  |  val2.2  |          |  val4.2  | id6      |
---------------------------------------------------------
|  val1.2  |          |          |  val4.3  | id7      |
---------------------------------------------------------

tabel2
---------------------------------------------------------
|  id1    |  id1    |  id1    |  id1    |timestamp1|
---------------------------------------------------------
|  id1    |  id2    |  id1    |  id1    |timestamp2|
---------------------------------------------------------
|  id1    |  id2    |  id3    |  id1    |timestamp3|
---------------------------------------------------------
|  id1    |  id2    |  id3    |  id4    |timestamp4|
---------------------------------------------------------
|  id1    |  id2    |  id5    |  id4    |timestamp5|
---------------------------------------------------------
|  id6    |  id6    |  id5    |  id6    |timestamp6|
---------------------------------------------------------
|  id7    |  id6    |  id5    |  id7    |timestampn|
---------------------------------------------------------
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