Avatar billede tingholm Mester
01. juni 2011 - 12:12 Der er 8 kommentarer og
1 løsning

update where forskellig fra næste

Hej Eksperter

Kan man i SQL lave en update der er betinget af om en værdi i rækken er forskellig fra værdien i næste række?

pseudo-sql:
UPDATE tabel SET forskellig = 'ja' WHERE felt <> næsteRecord.felt
Avatar billede arne_v Ekspert
05. juni 2011 - 04:22 #1
Foerst skal du goere dig klart at der er ikke nogen generel raekkefoelge for raekker i en database tabel - der er kun en raekkefoelge ved sortering efter et bestemt felt.

Derefter skal du overveje meget grundigt om det giver mening at gemme den information i tabellen. Hvis du laver INSERT eller DELETE vil du skulle opdatere andre raekker. Umiddelbart virker det meget bedre at lade din app haandtere forskellig fra eller ej naar data hentes fra en SELECT.

Hvis du vil skyde dig selv i foden saa skal du nok lav det programmatisk fremfor i ren SQL. Umiddelbart mener jeg ikke at man kan få en subquery til at referere til den tabel som man opdaterer.
Avatar billede tingholm Mester
05. juni 2011 - 09:10 #2
Ja, det skal nok laves i en SELECT i stedet...
Dataene skal bruges én gang efter mit udtræk, hvorefter de slettes. Næste gang laves der et nyt udtræk.

Jeg har allerede lavet kode der trækker data ud og løber dem igennem bag efter, men performance er helt ad h til...
Avatar billede arne_v Ekspert
05. juni 2011 - 16:56 #3
Du kan godt lave det i one pass.

Pseudo kode:

execute "SELECT felt1,felt2 FROM tabel WHERE bla bla"
last_felt1 = -1
while more rows begin
    row = get next row
    if row[felt1] == last_felt1 then
        forskellig = 'nej'
    else
        forskellig = 'ja'
    end if
    // goer noget med felt1, felt2 og forskellig
    last_felt1 = row[felt1]
end while
Avatar billede tingholm Mester
05. juni 2011 - 22:28 #4
tak, men din pseudo kode laver da også bare et udtræk og derefter en løkke der ser om data er forskellig...

...og vil derfor sandsynligvis performe lige så skidt :(
Avatar billede arne_v Ekspert
05. juni 2011 - 22:35 #5
Performance af den kode vil stort set vaere lige saa god som en tilsvarende kode der kun henter data uden at teste paa om forskellig eller ej.

At hente alle data ind i array og derefter loebe arrays igennem kan kost meget hvis det er store data maengder.

Hvis ovenstaaende performer daarligt, saa har det ikke noget med forskelligt testet at goere men noget med SELECT og database struktur at goere.
Avatar billede tingholm Mester
06. juni 2011 - 14:33 #6
SELECT table.*, table.check=table_tmp.check as sidste
FROM table INNER JOIN table AS table_tmp ON table.Id = table_tmp.Id-1;

Sådan skal den skæres, så kommer resultatet i ét hug. Men tak for input :)
Avatar billede arne_v Ekspert
07. juni 2011 - 01:43 #7
Saadan skal den ihvertfald ikke skaeres.

Overvej hvad der sker hvis der bliver slettet raekker.
Avatar billede tingholm Mester
07. juni 2011 - 08:49 #8
ja, så skal den selvfølgelig køres forfra. Men det er jo gældende uanset om man gør det i ét eller flere trin...

Når jeg vil have et resultat der er afhængig af andre rækker (SUM, COUNT, forskellig fra...) , så vil resultatet selvfølgelig ændre sig hvis de andre ændres...
Avatar billede arne_v Ekspert
07. juni 2011 - 22:11 #9
Ja.

Men det var ikke pointen.
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