在Oracle sql Query中使用"Join"删除

arj*_*soh 42 sql oracle sql-delete

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

在我的情况下,我有一个表ProductFilters和另一个表Products连接在一起的表ProductFilters.productID = Products.ID.我想删除高于或等于200 的行,ProductFilters并且ID他们引用的产品名称为"Mark"(名称是Product中的字段).

我想最初通知如果在Oracle的删除查询中JOIN是可接受的.如果不是,我应该如何修改此查询以使其工作,因为在该表单上我收到一个错误:

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'
);       
Run Code Online (Sandbox Code Playgroud)

xlo*_*gic 69

最近我学到了以下语法:

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

我认为它看起来比其他提议的代码更清洁.

  • @IvanGerasimenko它从两个表中删除行. (6认同)
  • @KevinOrtman如果对FK约束有级联删除操作则为yes,否则为no.(看看解释计划,看看哪一个,级联将不会显示) (5认同)
  • 此查询是仅从第一个表'productfilters'还是从两个表中删除行? (4认同)
  • @chillworld 是的。我测试了它。此外,这应该是公认的答案。远远优于现在。 (3认同)
  • 如果执行`select pf。*`,只会删除productfilters? (2认同)
  • 这个解决方案比我尝试的更清晰和优雅。使用子查询还避免了更复杂的联合或联接,从而使其对于更大的记录集更有效。我需要一个快速的解决方案来清除混合数据的子集。谢谢你。 (2认同)

dav*_*vek 35

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

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'
  )
); 
Run Code Online (Sandbox Code Playgroud)

要么

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'
  )
); 
Run Code Online (Sandbox Code Playgroud)