Avatar billede janegil Nybegynder
11. januar 2001 - 14:50 Der er 9 kommentarer og
1 løsning

opdaterbar forespørgsel – updatable query

Jeg får en feilmelding når jeg prøver å oppdatere en tabell med en sum fra en annen tabell. Den lyder «Operation must use an updatable qyuery»/«Handlingen skal bruge en opdaterbar forespørgsel»

SQL-kode for et eksempel:
UPDATE totaler
SET totaler.verdi =
(SELECT sum(verdi)
  from detaljer
  WHERE detaljer.nr=totaler.nr);

Hva er det som ikke er oppdaterbart her? Eller viktigere – hvordan kan jeg ellers oppdatere et felt med en summ hentet fra en annen \'tabell\'? (For eksemplet kunne jeg brukt en tabellopprettelsesforespørsel, men det er bare i eksemplet. På alvor har jeg bruk for å oppdatere i en eksisterende tabell.)

Eksemplet ligger på http://lbk.olivant.fo/test/sumupdate.mdb.

Jeg kjører Access97 på NT4.0.
Avatar billede keysersoze Ekspert
11. januar 2001 - 14:59 #1
ligger databasen et sted hvor der er skriverettigheder til den??? hvis ikke, så skal den det
Avatar billede janegil Nybegynder
11. januar 2001 - 15:05 #2
Jo da, jeg har skriverettigheter, og har forresten nettopp redigert den, og lagt inn dataene.
Avatar billede wisen Nybegynder
11. januar 2001 - 15:20 #3
Mangler der ikke en \"Where\" på UPDATE sætningen ?
Avatar billede wisen Nybegynder
11. januar 2001 - 15:25 #4
f.eks. UPDATE totaler SET totaler.verdi = (SELECT sum(verdi) FROM detaljer WHERE detaljer.nr=totaler.nr) WHERE xxxxx
Avatar billede janegil Nybegynder
11. januar 2001 - 15:31 #5
wisen: Jeg vil jo oppdatere ALLE poster i totaler, så jeg skulle ikke ha bruk for noen WHERE ytterst. Men prøvde med WHERE 0=0, fortsatt ikke oppdaterbart.

Forbindelsen mellom summen og detaljene den består av, skulle være ivaretatt av WHERE nr=nr i subquerien.
Avatar billede kasseper Nybegynder
11. januar 2001 - 15:39 #6
Det er fordi at din
________________________
(SELECT sum(verdi)
  from detaljer
  WHERE detaljer.nr=totaler.nr);
________________________

Ikke returnere et tal, som du kan bruge. Denne Select returnere et resultset med et felt uden overskrift, Jeg tror du er nød til at lave et view sådan her :

Create view MinSum
As SELECT sum(verdi) as DenneSum
  from detaljer
  WHERE detaljer.nr=totaler.nr;

også bruge det sådan her :


SQL-kode for et eksempel:
UPDATE totaler
SET totaler.verdi = MinSum.DenneSum


Avatar billede janegil Nybegynder
11. januar 2001 - 16:01 #7
Jeg laget et view som beregner summene:view_sum.
Prøvde så
UPDATE totaler
  SET totaler.verdi = view_sum.verdi ;
men da oppfatter den \'view_sum.verdi\' som et parameternavn. Prøvde så:
UPDATE totaler  SET totaler.verdi = view_sum.verdi  from view_sum.verdi;

men det er \'missing operator\' syntaksfeil.
Avatar billede janegil Nybegynder
11. januar 2001 - 16:35 #8
Hvis jeg har et helt enkelt view, uten sum() og GROUP BY, fungerer følgende:
update
  totaler inner join view_sum
  on totaler.nr=view_sum.nr
set totaler.verdi=view_sum.verdi;

Men hvis view\'et bruker sum(), er det ikke oppdaterbart.

Så jeg skal visst til å bruke en tabellopprettelsesforespørsel for å lagre et mellomresultat her.
Avatar billede janegil Nybegynder
12. januar 2001 - 12:29 #9
Jeg begynner å nærme meg noen konklusjoner:

- Oppdatering av en tabell med data fra en annen, kan bare gjøres ved å oppdatere en JOIN-basert forespøsel.

- JOIN-forespørsler med GROUP BY er ikke oppdaterbare, heller ikke på den siden som ikke er gruppert.

- Det er ingen vei utenom å opprette en ny tabell som mellomprodukt for å oppdatere en eksisterende tabell med summer fra en annen tabell.

Alternativt kan jeg, i mitt tilfelle, akseptere at jeg oppretter en ny tabell hver gang, og bruke CREATE INDEX til å gjenopprette de indeksene jeg har bruk for. Det er også gjerne mer effektivt å opprette en indeks, enn å oppdatere den.
Avatar billede janegil Nybegynder
13. februar 2001 - 08:18 #10
kasseper: Indirekte har du fortalt meg at jeg SKAL bruke Basic i Access; ting som kan gjøres i straight SQL, kan likevel ikke gjøres med SQL i Access.

Så jeg ble nødt til å lære meg litt Basic – jeg har overlevd Cobol, så jeg overlever nok Basic også...
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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