We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

Need help with DELETE SQL Query that has a SELECT in WHERE Clause

Fullsource
Fullsource asked
on
Medium Priority
290 Views
Last Modified: 2012-05-07
What i want to do is Delete the records from table tbl_FS_Category where the InternalID is equal to the select query results of a statement that includes the table i wish to delete from.

Not sure if this is possible or not, but if not i think i can get the same result by building a temp table with the results and then running a query  on that table instead.

Any thoughts would be greatly appreciated!
DELETE FROM tbl_FS_Category WHERE tbl_FS_Category.InternalID = 
 
SELECT tbl_FS_Category.InternalID
FROM tbl_FS_Category
LEFT OUTER JOIN tbl_FS_Items_Basic ON tbl_FS_Items_Basic.InternalID = tbl_FS_Category.InternalID
WHERE tbl_FS_Items_Basic.InternalID IS NULL

Open in new window

Comment
Watch Question

AneeshDatabase Consultant
CERTIFIED EXPERT
Top Expert 2009

Commented:
DELETE FROM tbl_FS_Category WHERE tbl_FS_Category.InternalID  IN (
 
SELECT tbl_FS_Category.InternalID
FROM tbl_FS_Category
LEFT OUTER JOIN tbl_FS_Items_Basic ON tbl_FS_Items_Basic.InternalID = tbl_FS_Category.InternalID
WHERE tbl_FS_Items_Basic.InternalID IS NULL

)

Commented:
Try something like this.
DELETE 
FROM tbl_FS_Category 
WHERE tbl_FS_Category.InternalID IN ( 
                                      SELECT tbl_FS_Category.InternalID
                                      FROM   tbl_FS_Category LEFT OUTER JOIN tbl_FS_Items_Basic 
                                             ON tbl_FS_Items_Basic.InternalID = tbl_FS_Category.InternalID
                                      WHERE tbl_FS_Items_Basic.InternalID IS NULL
                                     )

Open in new window

Author

Commented:
I get this error when trying your statements...


#1093 - You can't specify target table 'tbl_FS_Category' for update in FROM clause

Author

Commented:
That is why i think i have to create a temp table...but again, if i can do this all in one statement that would be freakin awesome.
AneeshDatabase Consultant
CERTIFIED EXPERT
Top Expert 2009

Commented:
DELETE tbl_FS_Category WHERE tbl_FS_Category.InternalID  IN (
 
SELECT tbl_FS_Category.InternalID
FROM tbl_FS_Category
LEFT OUTER JOIN tbl_FS_Items_Basic ON tbl_FS_Items_Basic.InternalID = tbl_FS_Category.InternalID
WHERE tbl_FS_Items_Basic.InternalID IS NULL

)
Commented:
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION
awking00Information Technology Specialist
CERTIFIED EXPERT

Commented:
See attached.
comments.txt
Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
You can do this in one statement, you will need an INNER JOIN.
-- syntax to inner join to a list of inclusive values to delete
DELETE fsc1
FROM tbl_FS_Category fsc1
INNER JOIN (
SELECT tbl_FS_Category.InternalID
FROM tbl_FS_Category
LEFT OUTER JOIN tbl_FS_Items_Basic ON tbl_FS_Items_Basic.InternalID = tbl_FS_Category.InternalID
WHERE tbl_FS_Items_Basic.InternalID IS NULL
) fsc2 ON fsc1.InternalID = fsc2.InternalID;
 
-- shorter version as your left join can just be put in the delete
DELETE fsc
FROM tbl_FS_Category fsc
LEFT OUTER JOIN tbl_FS_Items_Basic fsib ON fsib.InternalID = fsc.InternalID
WHERE fsib.InternalID IS NULL;

Open in new window

Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
awking00, with MySQL you get the error:
MySQL said: Documentation
#1093 - You can't specify target table 'your_table_name' for update in FROM clause

Have to use join approach, but I agree with you that it is simply a delete from one table where doesn't exist in another table, so my second example above is equivalent to yours.
awking00Information Technology Specialist
CERTIFIED EXPERT

Commented:
See attached.
comments.txt
Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
awking00, that is the error that you get.  NOT IN is another good method for this case.  The point is a temporary table is not necessary.  

Why are you commenting using file attachments, BTW?
Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
The join approach has to be used where you would typically use EXISTS because of the error noted when you have multiple fields to compare.  When just one that IN or NOT IN can work that should be fine.  Also if the subquery is to the same table as originally being used in this question, even the (NOT) IN solution will yield the same error message.

Anyway, hopefully, Fullsource is still monitoring to benefit from this additional information. :)
awking00Information Technology Specialist
CERTIFIED EXPERT

Commented:
See attached.
comments.txt
Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
LOL. :)
EXISTS works in MySQL, just not with the DELETE syntax.  Actually try the queries in MySQL some time and you will see what I mean.
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.