0

This is my database table tbl_rate

delimiter $$

CREATE TABLE `tbl_rate` (
  `Rate_ID` int(11) NOT NULL AUTO_INCREMENT,
  `Route_ID` int(11) NOT NULL,
  `From_LocationID` int(11) NOT NULL,
  `To_LocationID` int(11) NOT NULL,
  `Normal_Rate` double NOT NULL,
  `Discounted_Rate` double NOT NULL,
  PRIMARY KEY (`Rate_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=289 DEFAULT CHARSET=latin1$$

Execute SQL statement from tbl_rate

SELECT Rate_ID FROM tbl_rate WHERE 

From_LocationID NOT IN(
select 
   a.Route_LocationID from_loc_id
from tbl_route a 
inner join tbl_route b on a.Route_ID = b.Route_ID and a.Route_Seq < b.Route_Seq and a.Route_ID = 3
inner join tbl_location la on la.Location_ID = a.Route_LocationID
inner join tbl_location lb on lb.Location_ID = b.Route_LocationID
order by a.Route_Seq, b.Route_Seq)

AND To_LocationID NOT IN(
select 
   b.Route_LocationID to_loc_id
from tbl_route a 
inner join tbl_route b on a.Route_ID = b.Route_ID and a.Route_Seq < b.Route_Seq and a.Route_ID = 3
inner join tbl_location la on la.Location_ID = a.Route_LocationID
inner join tbl_location lb on lb.Location_ID = b.Route_LocationID
order by a.Route_Seq, b.Route_Seq)
AND Route_ID = 3)

this is my sql result from tbl_rate

Rate_ID
--------
253
254

i want to delete this two Rate_ID from table tbl_rate, how to add in delete SQL statement?

peterm
  • 91,357
  • 15
  • 148
  • 157
John Walker
  • 1,121
  • 4
  • 26
  • 68
  • You cannot select and delete from the same table in the same query. 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) – Koryu Dec 14 '13 at 09:11

3 Answers3

1
    DELETE FROM tbl_rate WHERE 

From_LocationID NOT IN(
select 
   a.Route_LocationID from_loc_id
from tbl_route a 
inner join tbl_route b on a.Route_ID = b.Route_ID and a.Route_Seq < b.Route_Seq and a.Route_ID = 3
inner join tbl_location la on la.Location_ID = a.Route_LocationID
inner join tbl_location lb on lb.Location_ID = b.Route_LocationID
order by a.Route_Seq, b.Route_Seq)

AND To_LocationID NOT IN(
select 
   b.Route_LocationID to_loc_id
from tbl_route a 
inner join tbl_route b on a.Route_ID = b.Route_ID and a.Route_Seq < b.Route_Seq and a.Route_ID = 3
inner join tbl_location la on la.Location_ID = a.Route_LocationID
inner join tbl_location lb on lb.Location_ID = b.Route_LocationID
order by a.Route_Seq, b.Route_Seq)
AND Route_ID = 3
Sanal K
  • 723
  • 4
  • 14
1

If you want to use a subquery in DELETE with the same table you're deleting from all you have to do is to wrap your query in additional outer select

DELETE 
  FROM tbl_rate 
 WHERE Rate_ID IN
(
  SELECT Rate_ID
    FROM
  (
    SELECT Rate_ID...  --- Your original query goes here
  ) q
);

Here is SQLFiddle demo

Another option is to use multi-table DELETE syntax

DELETE t
  FROM tbl_rate t JOIN
(
  SELECT Rate_ID... --- Your original query goes here
) q
    ON t.Rate_ID = q.Rate_ID;

Here is SQLFiddle demo


Your complete DELETE statement with a subquery might look like

DELETE 
  FROM tbl_rate 
 WHERE Rate_ID IN
(
  SELECT Rate_ID
    FROM
  (
    SELECT Rate_ID 
      FROM tbl_rate 
     WHERE From_LocationID NOT IN
    (
        select a.Route_LocationID from_loc_id
          from tbl_route a 
               inner join tbl_route b 
                   on a.Route_ID = b.Route_ID and a.Route_Seq < b.Route_Seq and a.Route_ID = 3
               inner join tbl_location la 
                   on la.Location_ID = a.Route_LocationID
               inner join tbl_location lb 
                   on lb.Location_ID = b.Route_LocationID
         order by a.Route_Seq, b.Route_Seq
    )
       AND To_LocationID NOT IN
    (
        select b.Route_LocationID to_loc_id
          from tbl_route a 
               inner join tbl_route b 
                   on a.Route_ID = b.Route_ID and a.Route_Seq < b.Route_Seq and a.Route_ID = 3
               inner join tbl_location la 
                   on la.Location_ID = a.Route_LocationID
               inner join tbl_location lb 
                   on lb.Location_ID = b.Route_LocationID
         order by a.Route_Seq, b.Route_Seq
    )
       AND Route_ID = 3
   ) q
);
peterm
  • 91,357
  • 15
  • 148
  • 157
0

Try to add DISTINCT because mySQL is super-cautious in subqueries, like:

 SELECT DISTINCT Rate_ID FROM tbl_rate WHERE ....

So, it would be like:

DELETE FROM tbl_rate WHERE Rate_ID ( SELECT DISTINCT Rate_ID FROM tbl_rate WHERE .... )

Another way is to make an alias of your subquery like:

DELETE FROM tbl_rate WHERE Rate_ID ( 
      SELECT * FROM (SELECT Rate_ID FROM tbl_rate WHERE .... ) A 
)
Edper
  • 9,144
  • 1
  • 27
  • 46