Solved

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

Posted on 2009-06-29
14
216 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

0
Comment
Question by:Fullsource
  • 5
  • 3
  • 2
  • +2
14 Comments
 
LVL 75

Expert Comment

by:Aneesh Retnakaran
ID: 24737628
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

)
0
 
LVL 17

Expert Comment

by:pssandhu
ID: 24737629
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

0
 

Author Comment

by:Fullsource
ID: 24737708
I get this error when trying your statements...


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

Author Comment

by:Fullsource
ID: 24737722
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.
0
 
LVL 75

Expert Comment

by:Aneesh Retnakaran
ID: 24737763
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

)
0
 
LVL 17

Accepted Solution

by:
pssandhu earned 500 total points
ID: 24737775
Hmm.. in that case create a temporary table and put all values in the temp table and then do a select statement from the temp table instead of the subquery:
CREATE TEMPORARY TABLE Temp ( ID  INT)
INSERT INTO Temp
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
 
DELETE FROM tbl_FS_Category WHERE tbl_FS_Category.InternalID IN ( Select ID From Temp)


0
 
LVL 32

Expert Comment

by:awking00
ID: 24737974
See attached.
comments.txt
0
Control application downtime with dependency maps

Visualize the interdependencies between application components better with Applications Manager's automated application discovery and dependency mapping feature. Resolve performance issues faster by quickly isolating problematic components.

 
LVL 59

Expert Comment

by:Kevin Cross
ID: 24738026
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

0
 
LVL 59

Expert Comment

by:Kevin Cross
ID: 24738057
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.
0
 
LVL 32

Expert Comment

by:awking00
ID: 24738244
See attached.
comments.txt
0
 
LVL 59

Expert Comment

by:Kevin Cross
ID: 24738315
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?
0
 
LVL 59

Expert Comment

by:Kevin Cross
ID: 24738363
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. :)
0
 
LVL 32

Expert Comment

by:awking00
ID: 24738403
See attached.
comments.txt
0
 
LVL 59

Expert Comment

by:Kevin Cross
ID: 24738477
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.
0

Featured Post

Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Creating and Managing Databases with phpMyAdmin in cPanel.
Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…

929 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now