在Oracle sql Query中使用“Join”删除

时间:2012-10-01 11:06:38

标签: sql oracle sql-delete

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

在我的情况下,我有一个表ProductFilters,另一个表Products加入了字段ProductFilters.productID = Products.ID。我想从ProductFilters中删除ID高于或等于200的行,并且他们引用的产品名称为“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'
);       

4 个答案:

答案 0 :(得分:58)

最近我学会了以下语法:

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

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

答案 1 :(得分:32)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

请使用子查询

class foo{
  public function __construct{} {
  }
  public static function instance( $bar ) {
  }
  public static function Do_Stuff_1() {
    // Make $bar available here.
  }
  public function Do_Stuff_2() {
    // Make $bar available here.
  }
}