71

I am not deeply acquainted with Oracle Sql Queries, therefore I face a problem on deleting some rows from a table which must fulfill a constraint which includes fields of another (joining) table. In other words I want to write a query to delete rows including JOIN.

In my case I have a table ProductFilters and another table Products joined on fields ProductFilters.productID = Products.ID. I want to delete the rows from ProductFilters having an ID higher or equal to 200 and the product they refer has the name 'Mark' (name is a field in Product).

I would like to be informed initially if JOIN is acceptable in a Delete Query in Oracle. If not how should I modify this Query in order to make it work, since on that form I receive an error:

DELETE From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
(
     Select rowid from PRODUCTFILTERS 
     inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
     And PRODUCTS.NAME= 'Mark'
);       
1

7 Answers 7

122

Recently I learned of the following syntax:

DELETE (SELECT *
        FROM productfilters pf
        INNER JOIN product pr
            ON pf.productid = pr.id
        WHERE pf.id >= 200
            AND pr.NAME = 'MARK')

I think it looks much cleaner then other proposed code.

Sign up to request clarification or add additional context in comments.

11 Comments

does this query delete rows only from the first table 'productfilters' or from both of the tables?
@IvanGerasimenko it deletes rows from both tables.
@KevinOrtman If there is a cascade delete action on FK constraint then yes, otherwise no. (look after the explain plan to see wich one, cascade won't be showed)
if you do select pf.* it will only delete the productfilters?
@chillworld Yes. I tested it. Also, this should be the accepted answer. Far superior to the current.
|
61

Based on the answer I linked to in my comment above, this should work:

delete from
(
select pf.* From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
  (
     Select rowid from PRODUCTFILTERS 
     inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
     And PRODUCTS.NAME= 'Mark'
  )
); 

or

delete from PRODUCTFILTERS where rowid in
(
select pf.rowid From PRODUCTFILTERS pf 
where pf.id>=200 
And pf.rowid in 
  (
     Select PRODUCTFILTERS.rowid from PRODUCTFILTERS 
     inner join PRODUCTS on PRODUCTFILTERS.PRODUCTID = PRODUCTS.ID 
     And PRODUCTS.NAME= 'Mark'
  )
); 

2 Comments

I have tried the second one and I receive the error: "Column ambiguously defined". Besides I think that the correct syntax at the begin is delete PRODUCTFILTERS where... A "From" is superfluous in a delete Query.
rowid is ambiguous without its alias. For a delete with join, the query is fine.
5

Use a subquery in the where clause. For a delete query requirig a join, this example will delete rows that are unmatched in the joined table "docx_document" and that have a create date > 120 days in the "docs_documents" table.

delete from docs_documents d
where d.id in (
    select a.id from docs_documents a
    left join docx_document b on b.id = a.document_id
    where b.id is null
        and floor(sysdate - a.create_date) > 120
 );

Comments

4

Personally, I would use the EXISTS construct. As described in the examples on this web page:

DELETE ProductFilters pf
WHERE EXISTS (
   SELECT *
   FROM Products p
   WHERE p."productID"=pf."productID"
   AND p.NAME= 'Mark'
)
AND pf."id">=200;

Comments

1

I think better way are to use EXISTS

DELETE FROM Table1 t1
WHERE SOME_ID = 12345
AND EXISTS (SELECT 1 
            FROM Table2 t2
            WHERE t2.ST_ID = t1.ST_ID
            AND SOME_EVENT_ID = 404
            )
;

Comments

0

Oracle Database 23ai added direct joins for delete. So you can do:

delete productfilters pf 
from   products p
where  pf.id >= 200 
and    pf.productid = p.id 
and    p.name= 'Mark'

Comments

-1

Please use a subquery

delete from productfilters
where productid in (Select id from products where name='Mark') and Id>200;

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.