用“删除”;加入;在oraclesql查询中

用“删除”;加入;在oraclesql查询中,sql,oracle,sql-delete,Sql,Oracle,Sql Delete,我对Oracle Sql查询不太熟悉,因此在从表中删除某些行时会遇到一个问题,这些行必须满足包含另一个(联接)表的字段的约束。换句话说,我想写一个查询来删除包含JOIN的行 在我的例子中,有一个表ProductFilters和另一个表Products在字段ProductFilters.productID=Products.ID上连接。我想删除ProductFilters中ID大于或等于200的行,并且它们引用的产品具有名称“Mark”(名称是产品中的一个字段) 如果在Oracle中的删除查询中可

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

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

如果在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'
);       

根据我在上述评论中链接的答案,这应该是可行的:

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 (SELECT *
        FROM productfilters pf
        INNER JOIN product pr
            ON pf.productid = pr.id
        WHERE pf.id >= 200
            AND pr.NAME = 'MARK')

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

在where子句中使用子查询。对于要求联接的删除查询,此示例将删除联接表“docx\u document”中不匹配且“docs\u documents”表中创建日期>120天的行


是的,您可以使用联接进行删除:请看这里,我尝试了第二个联接,但收到错误:“定义不明确的列”。此外,我认为正确的语法是删除PRODUCTFILTERS,其中。。。“发件人”在删除查询中是多余的。如果没有别名,rowid是不明确的。对于带联接的删除,查询是可以的。此查询是仅从第一个表“productfilters”中删除行,还是从两个表中删除行?@IvanGerasimenko它从两个表中删除行。@KevinOrtman如果FK约束上有级联删除操作,则为是,否则为否。(查看解释计划以查看其中一个,级联将不会显示)如果您选择pf.它将只删除productfilters?此解决方案比我尝试的更清晰、更优雅。使用子查询还可以避免更复杂的联合或联接,从而使其对于较大的记录集更有效。我需要一个快速的解决方案来清除混合数据的子集。非常感谢。
DELETE (SELECT *
        FROM productfilters pf
        INNER JOIN product pr
            ON pf.productid = pr.id
        WHERE pf.id >= 200
            AND pr.NAME = 'MARK')
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
 );