在Oracle sql查询中使用“Join”删除

问题描述 投票:0回答:6

我对 Oracle Sql 查询不太熟悉,因此我面临着从表中删除某些行的问题,这些行必须满足包含另一个(连接)表的字段的约束。换句话说,我想编写一个查询来删除包括 JOIN 在内的行。

就我而言,我有一个表

ProductFilters
和另一个表
Products
连接在字段
ProductFilters.productID = Products.ID
上。我想从
ProductFilters
中删除
ID
大于或等于 200 的行,并且它们引用的产品的名称为“Mark”(名称是产品中的一个字段)。

我希望首先被告知 JOIN 在 Oracle 的删除查询中是否可以接受。如果不是,我应该如何修改此查询才能使其工作,因为在该表单上我收到错误:

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'
);       
sql oracle sql-delete
6个回答
117
投票

最近我学到了以下语法:

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

我认为它看起来比其他建议的代码干净得多。


57
投票

根据我在上面的评论中链接到的答案,这应该有效:

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'
  )
); 

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'
  )
); 

4
投票

在where子句中使用子查询。对于需要联接的删除查询,此示例将删除联接表“docx_document”中不匹配的行以及“docs_documents”表中创建日期 > 120 天的行。

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
 );

2
投票

就个人而言,我会使用

EXISTS
结构。如此网页上的示例所述:

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

0
投票

我认为更好的方法是使用 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
            )
;

-1
投票

请使用子查询

delete from productfilters
where productid in (Select id from products where name='Mark') and Id>200;
© www.soinside.com 2019 - 2024. All rights reserved.