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?

1

3 Answers 3

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
);
Sign up to request clarification or add additional context in comments.

3 Comments

That should work. Also take a look at this answer
@peterm Error Code: 1248. Every derived table must have its own alias
See updated answer. I've incorporated your query into a subquery.
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

3 Comments

i want to add in delete statement with my SELECT statement
@ChinYe can you check now?
this is correct, but any idea to make Select Rate_ID from tbl_Rate ? like my original SQL statement
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 
)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.