12. juni 2007 - 15:49Der 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);
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.
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).
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.
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.
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.
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...
Synes godt om
Ny brugerNybegynder
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.