Avatar billede it-dyret Nybegynder
16. oktober 2007 - 23:46 Der er 13 kommentarer og
1 løsning

Tricky UPDATE

Jeg har en databasen med bl.a. disse tabeller(attributter):

subject (id, name, postalcode, isActive)
agentspostalcodes (id, postalcode, agentId)

Jeg vil køre en update subjects.isActive (skal sættes til '0') på de rækker i subjects, som fremkommer af denne select:

SELECT subjects.id
FROM subjects JOIN agentspostalcodes ON subjects.postalcode = agentspostalcodes.postalcode
WHERE agentspostalcodes.agentid = 1;

Jeg har forsøgt følgende:

UPDATE subjects SET isactive = 0 WHERE (
SELECT subjects.id
FROM subjects JOIN agentspostalcodes ON subjects.postalcode = agentspostalcodes.postalcode
WHERE agentspostalcodes.agentid = 1
)

Men får denne fejl:
Error Code : 1093
You can't specify target table 'subjects' for update in FROM clause

Jeg har efterfølgende forsøgt at lave et view og bruge dette således:

CREATE VIEW view_subjects AS
SELECT subjects.id
FROM subjects JOIN agentspostalcodes ON subjects.postalcode = agentspostalcodes.postalcode
WHERE agentspostalcodes.agentid = 1;

UPDATE subjects SET isactive = 0 WHERE EXISTS view_subjects;

Men får følgende fejl:
Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'view_subjects' at line 1

Hvad gør jeg forkert???
Avatar billede w13 Novice
16. oktober 2007 - 23:51 #1
Hvad hvis du retter FROM subjects til FROM ?subjects? ?
Avatar billede neoman Novice
16. oktober 2007 - 23:53 #2
prøv
UPDATE subjects SET subjects.isactive = 0 WHERE subjects.id IN(
SELECT subjects.id
FROM subjects JOIN agentspostalcodes ON subjects.postalcode = agentspostalcodes.postalcode
WHERE agentspostalcodes.agentid = 1
)
Avatar billede it-dyret Nybegynder
17. oktober 2007 - 00:02 #3
>> neoman
Jeg får fortsat denne fejl:
Error Code : 1093
You can't specify target table 'subjects' for update in FROM clause

Det er som om, at man ikke kan bruge samme tabel i den nestede SELECT, som man har i UPDATE statementet... Men det er blot et gæt ud fra fejlmeddelelsen.

>> w13
Jeg er ikke sikker på, hvad du mener... Prøv at smide et helt eksempel
Avatar billede erikjacobsen Ekspert
17. oktober 2007 - 00:05 #4
I hvert fald i mysql 4.1 kan man ikke bruge samme tabel i en subselect som man updater. Hvilken mysql-version bruger du?
Avatar billede it-dyret Nybegynder
17. oktober 2007 - 00:10 #5
>> erikjacobsen
Jeg bruger version 5.0.22
Avatar billede neoman Novice
17. oktober 2007 - 00:16 #6
Hvad med
UPDATE subjects SET subjects.isactive = 0 WHERE subjects.id IN(
SELECT s1.id
FROM subjects AS s1 JOIN agentspostalcodes ON s1.postalcode = agentspostalcodes.postalcode
WHERE agentspostalcodes.agentid = 1
)
Avatar billede neoman Novice
17. oktober 2007 - 00:21 #7
Selv om - det har nok lange udsigte,r da man næppe kan snyde den med lidt alias:)
Avatar billede it-dyret Nybegynder
17. oktober 2007 - 00:22 #8
>> neoman
Som du selv forventer, så er det samme problem stadigvæk :)
Avatar billede erikjacobsen Ekspert
17. oktober 2007 - 00:23 #9
Jeg har ikke lige tid til at lede, prøv selv, men det med 4.1 står her: http://dev.mysql.com/tech-resources/articles/4.1/subqueries.html
Avatar billede neoman Novice
17. oktober 2007 - 00:33 #10
Et nyt skud:
UPDATE subjects SET subjects.isactive = 0 WHERE subjects.postalcode IN (Select postalcode FROM agenpostalcodes WHERE agentspostalcodes.agentid = 1)
Avatar billede it-dyret Nybegynder
17. oktober 2007 - 00:46 #11
>> neoman
Du er en magiker! Det virker! :)

Godt tænkt at fjerne subjects fra den indre select! Du må meget gerne smide et svar og jeg vil kaste størstedelen af pointene efter dig

>> erikjacobsen
Du må ligeledes gerne smide et svar, hvor jeg vil give dig en mindre klat for at bidrage til løsningen...
Avatar billede neoman Novice
17. oktober 2007 - 00:48 #12
weeeeeeee:)
Avatar billede erikjacobsen Ekspert
17. oktober 2007 - 08:28 #13
Nej tak ;)
Avatar billede it-dyret Nybegynder
17. oktober 2007 - 13:45 #14
Ok, jeg skal da ikke tvinge dig :)
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