58

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

在我的情况下,我有一个表ProductFilters和另一个表Products加入 fields ProductFilters.productID = Products.ID。我想删除大于或等于 200 的行,并且它们引用的产品具有名称“标记”(名称是产品中的一个字段)ProductFiltersID

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

5 回答 5

101

最近我学到了以下语法:

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

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

于 2015-10-21T14:55:54.587 回答
52

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

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'
  )
); 
于 2012-10-01T11:12:34.553 回答
1

在 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
 );
于 2021-01-22T17:17:24.403 回答
0

就个人而言,我会使用该EXISTS构造。如本网页示例中所述:

DELETE ProductFilters pf
WHERE EXISTS (
   SELECT *
   FROM Products p
   WHERE p."productID"=pf."productID"
   AND p.NAME= 'Mark'
)
AND pf."id">=200;
于 2022-02-01T21:11:06.270 回答
-1

请使用子查询

delete from productfilters
where productid in (Select id from products where name='Mark') and Id>200;
于 2021-06-18T17:05:06.187 回答