Avatar billede fennec Nybegynder
09. november 2004 - 11:51 Der er 4 kommentarer og
1 løsning

en update med data fra samme tabel

Jeg har en tabel med følgende kolonner.
ID, mID, dato, counter, valDif, mCounter, mValdif

Nu er problemet så, at jeg skal have flyttet alle data fra counter og valdif fra mID=29 over i mCounter og mValDif hvor mID=31 og hvor datoerne også er den samme.

Jeg er kommet frem til noget i denne stil (som selvfølgelig ikke virker), men jeg håber så I kan se, hvor jeg vil hen:

UPDATE  GREEN_MeterData
SET    a1.mCounter = a2.counter, a2.mValDif = a2.Valdif
FROM    GREEN_MeterData a1, GREEN_MeterData a2
WHERE  a1.mid = 31 AND a2.mid = 29 AND a1.dato = a2.dato

Og lidt data eks:
106264 | 29 | 09-09-2004 | 34417,1 | 151,5 | NULL | NULL
104800 | 29 | 07-07-2004 | 34265,6 | 79,2  | NULL | NULL
104234 | 29 | 08-06-2004 | 34186,4 | 199,7 | NULL | NULL
106263 | 31 | 09-09-2004 | 1373,52 | 6560  | NULL | NULL
104799 | 31 | 07-07-2004 | 1366,96 | 3320  | NULL | NULL
104233 | 31 | 08-06-2004 | 1363,64 | 8350  | NULL | NULL

Skulle gerne blive til dette (så jeg kan slette 29 bagefter):
106263 | 31 | 09-09-2004 | 1373,52 | 6560  | 34417,1 | 151,5
104799 | 31 | 07-07-2004 | 1366,96 | 3320  | 34265,6 | 79,2
104233 | 31 | 08-06-2004 | 1363,64 | 8350  | 34186,4 | 199,7

Jeg kan godt klare det gennem ASP, men det er ensbetydende med at jeg skal til at lave omkring 2.000 select's og 100.000 update's, og det har jeg ikke lyst til.

ps. Det er data fra en gammel DOS database, hvor der var flere ting, der var lavet forkert, og det er jeg nu er ved at rette op på.
Avatar billede trer Nybegynder
10. november 2004 - 15:11 #1
Hvis du kan lave en select som gør hvad du ønsker, så kan du lave en update ud fra selecten:

select sum(), max(), whatever()
from tabel as t1 inner join tabel as t2
on t1.id = t2.id

=>

update tabel set
  col = sum(),,,,
from tabel as t1 inner join tabel as t2
on t1.id = t2.id

måske er det vejen frem ?
Avatar billede fennec Nybegynder
10. november 2004 - 16:18 #2
Problemet er at jeg skal update data, hvor datoen er den samme. Og jeg kan (mig bekendt) ikke få datoen fra updatet rækken, med over i selecten.
Avatar billede trer Nybegynder
10. november 2004 - 23:26 #3
Hmm - kan du ikke blot joine på datoen?
Avatar billede fennec Nybegynder
11. november 2004 - 08:28 #4
Ikke hvad jeg ved af. Et eks som jeg så ser det:

update GREEN_MeterData
set mCounter = (
  select counter from GREEN_MeterData where mid=29 and dato="updateRækkensDato"
)
where mid=31

Jeg ved ikke, hvordan jeg skal få fat i "updateRækkensDato".
Avatar billede fennec Nybegynder
11. november 2004 - 09:59 #5
Har fundet en løsning.

Mit første eks virker åbentbart (næsten), man man kan ikke bruge den, hvis tabellerne er den samme. Jeg har derfor lavet en kopi af GREEN_MeterData (kaldet GREEN_MeterData1). Jeg kan så køre denne, som opdatere rækkerne:

UPDATE  GREEN_MeterData
SET    mCounter = a2.counter, mValDif = a2.Valdif
FROM    GREEN_MeterData a1, GREEN_MeterData1 a2
WHERE  a1.mID = 31 AND a2.mID = 29 AND a1.dato = a2.dato

Jeg har så smidt denne over i ASP og dynamisk genereret de to mID værdier.
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