Thread: How to delete multiple records
Dear all, I execute this query on below: delete from PRODUCT where exists ( select product_id, item_id from PRODUCT where research_date < '2006-01-01' ) this query deleted all records data in PRODUCT table. The subquery return only some records. Tell me about other idea? and What's wrong from this query. Best regards, -Javanesevn
Hi, Javanesevn, Javanesevn wrote: > I execute this query on below: > > delete from PRODUCT > where exists ( > select > product_id, item_id > from PRODUCT > where > research_date < '2006-01-01' > ) > this query deleted all records data in PRODUCT table. The subquery > return only some records. Yes, that's correct. You don't have any interconnection between the inner and the outer query. So, for every outer row, there exists an inner row which has research_date < '2006-01-01'. > Tell me about other idea? and What's wrong from this query. For this simple case, why don't you do: DELETE FROM PRODUCT WHERE research_date < '2006-01-01' Or do you want to delete all entries for products that have at least one entry with a matching research date? Then go along something like DELETE FROM product WHERE EXISTS ( SELECT * from product innr WHERE research_date < '2006-01-01' AND product_id= innr.product_id AND item_id = innr.item_id ); HTH, Markus -- Markus Schaber | Logical Tracking&Tracing International AG Dipl. Inf. | Software Development GIS Fight against software patents in Europe! www.ffii.org www.nosoftwarepatents.org
On Thu, Sep 14, 2006 at 03:07:35PM +0900, Javanesevn wrote: > Dear all, > > I execute this query on below: > > delete from PRODUCT > where exists ( > select > product_id, item_id > from PRODUCT > where > research_date < '2006-01-01' > ) > this query deleted all records data in PRODUCT table. The subquery > return only some records. > Tell me about other idea? and What's wrong from this query. The easiest way is to do it like this: delete from PRODUCT where research_date < '2006-01-01' But if you really want to use a subquery, you want to relate it to the current record: delete from PRODUCT where product_in in ( select product_id from PRODUCT where research_date < '2006-01-01' ) In your example you just test if some records exist. They allways do, so the where clause evaluates to true for every row -- __________________________________________________ "Nothing is as subjective as reality" Reinoud van Leeuwen reinoud.v@n.leeuwen.net http://www.xs4all.nl/~reinoud __________________________________________________