0

Guys i am trying to delete some records from the database using a nested query:

delete from imageviewer_crreviewerformdata
where imageviewer_crreviewerformdata.FormDataId in
(select distinct imageviewer_crreviewerformdata.FormDataId
from imageviewer_crreviewerformdata,imageviewer_crtask
where imageviewer_crreviewerformdata.TaskId = imageviewer_crtask.TaskId
and imageviewer_crtask.RevProtId in (1));

i get the well known mysql exception. Could someone help to formulate the query?

Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
thanili
  • 777
  • 4
  • 26
  • 57
  • possible duplicate of [Mysql error 1093 - Can't specify target table for update in FROM clause](http://stackoverflow.com/questions/45494/mysql-error-1093-cant-specify-target-table-for-update-in-from-clause) – Lukas Eder May 25 '14 at 08:26

3 Answers3

1
delete d 
from imageviewer_crreviewerformdata d
inner join imageviewer_crtask t on d.TaskId = t.TaskId
where t.RevProtId in (1)
juergen d
  • 201,996
  • 37
  • 293
  • 362
0

i think its just telling you to remove the table alias from the query thus

delete from imageviewer_crreviewerformdata
where FormDataId in
(select distinct imageviewer_crreviewerformdata.FormDataId
from imageviewer_crreviewerformdata,imageviewer_crtask
where imageviewer_crreviewerformdata.TaskId = imageviewer_crtask.TaskId
and imageviewer_crtask.RevProtId in (1));
jenson-button-event
  • 18,101
  • 11
  • 89
  • 155
0

When i need to delete from a table using that table as the source of select, i usually create a temporary table to use as reference for deletion. Maybe its a bit traditional but it works.

You need to create a temporary table, the delete by joining on the temp table, then drop the temp table.

CREATE TEMPORARY TABLE temp.tempdelete AS select distinct
imageviewer_crreviewerformdata.FormDataId
from imageviewer_crreviewerformdata,imageviewer_crtask
where imageviewer_crreviewerformdata.TaskId = imageviewer_crtask.TaskId
and imageviewer_crtask.RevProtId in (1));

Then you can delete

DELETE FROM imageviewer_crreviewerformdata WHERE FormDataId IN (SELECT FormDataId FROM temp.tempdelete) 

Then drop the temp table.

DROP TABLE temp.temptable.

This require that you have a folder named temp. Its also a good solution thath can be used easier in stored procedures.

Mad Dog Tannen
  • 7,129
  • 5
  • 31
  • 55