Avatar billede hejmeddigbabe Nybegynder
12. juni 2007 - 15:49 Der er 7 kommentarer og
1 løsning

Brug af Exists til opdatering

Jeg skal opdatere en række email adresser i tabellen Customer1 fra tabellen [Opadering_af_email] ved brug af exists funktionen. Jeg får følgende fejl: "Handlingen skal bruge en opdaterbar forespørgsel Error 3073".

Jeg bruger access 2007. Tabellen jeg skriver til "Customer1" er ikke linket til andre tabeller, så den burde ikke være skrivebeskyttet. Er der nogen der kan hjælpe med dette?

Min kode er følgende:

UPDATE tbl_Customer1 SET tbl_Customer1.Email =
(SELECT Opdatering_af_email.[E-mail]
FROM Opdatering_af_email
WHERE Opdatering_af_email.CustomerID =tbl_Customer1.CustomerID)

WHERE Exists (SELECT Opdatering_af_email.[E-mail]
    FROM Opdatering_af_email
    WHERE Opdatering_af_email.CustomerID = tbl_Customer1.CustomerID);
Avatar billede hejmeddigbabe Nybegynder
12. juni 2007 - 15:55 #1
Jeg har foreesten brugt det nederste eksempel fra denne side: http://www.techonthenet.com/sql/update.php
Avatar billede kjulius Novice
12. juni 2007 - 19:59 #2
Din SQL burde virke. Med mindre der findes flere rækker med samme CustomerID i din Opdatering_af_email tabel. Hvis der er flere, vil subselecten returnere mere end 1 række og det kan ikke bruges til at opdatere med, da der kun er én række at opdatere.

(Jeg forstår så bare ikke fejlmeldingen, som ikke er helt logisk)

Du kunne jo prøve at sætte f.eks. en First funktion på dit felt i Set sektionen, således at der altid skal opdateres med den først fundne række.

UPDATE tbl_Customer1
SET Email = (SELECT FIRST([E-mail])
  FROM Opdatering_af_email
  WHERE CustomerID = tbl_Customer1.CustomerID)

WHERE EXISTS (SELECT [E-mail]
    FROM Opdatering_af_email
    WHERE CustomerID = tbl_Customer1.CustomerID);

Din opdateringsforespørgsel er helt efter bogen i henhold til standard-SQL, men i Access ville man normalt gøre det lidt anderledes:

UPDATE tbl_Customer1
INNER JOIN Opdatering_af_email ON tbl_Customer1.CustomerID = Opdatering_af_email.CustomerID
SET tbl_Customer1.email = Opdatering_af_email.[e-mail]

Dette er ikke standard, og vil ikke direkte kunne overføres til andre databaser. Til gengæld er det måske lettere at forstå, at det ligner den måde man ellers sammensætter tabeller.
Avatar billede kjulius Novice
12. juni 2007 - 20:05 #3
En anden mulig grund til fejlmeldingen er, hvis du ikke har en primary key i den tabel du vil opdatere. For at kunne opdatere en tabel, skal der være en primary key (som evt. godt kan bestå af flere delfelter, men som tilsammen skal identificere hver række helt entydigt).
Avatar billede hejmeddigbabe Nybegynder
12. juni 2007 - 21:52 #4
Tak. Jeg prøver jeres ideer imorgen. Og skriver så tilbage.
Jeg kan da godt se der fede i kjulius 2. query hvor WHERE bare er udeladt.
Avatar billede hejmeddigbabe Nybegynder
13. juni 2007 - 10:06 #5
Det lykkedes at foretage opdateringen ved brug af JOIN sætningen. CustomerID var nemlig primary key. Tusind tak for hjælpen. Så er jeg blevet det klogere.
Men mon ikke at den originale sætning så ville virke i f.eks. MySQL.
Avatar billede kjulius Novice
13. juni 2007 - 22:34 #6
Hmmm.. Du tog selv alle point. Var det meningen?

Jeg er næsten sikker på, at den vil virke i de fleste større databaser. Den virker helt sikkert i f.eks. DB2, som jeg arbejder en del med.

Men netop MySQL tror jeg også arbejder næsten som Access på det punkt, uden at jeg dog ved om den ikke også ville kunne klare en standard-SQL update sætning.
Avatar billede hejmeddigbabe Nybegynder
14. juni 2007 - 00:31 #7
Det er jeg ked af. Har stadig ikke fattet point givnings systemet på eksperten. Var da meningen at du skulle have haft dem. Sorry. Tusind tak for hjælpen.

Venlig hilsen Kristian
Avatar billede kjulius Novice
14. juni 2007 - 01:10 #8
Det er jo ingen katastrofe. Systemet med, at man først må afgive et svar (som er det eneste der kan udløse point) efter at være opfordret til det af opgavestilleren, kræver en del tilvænning. Det virker lidt - hmm.. firkantet. Men det har været diskuteret meget og mange gange herinde, og bliver nok ikke lavet om lige med det samme. Så man kan lige så godt vænne sig til det...
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