我对 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'
);
最近我学到了以下语法:
DELETE (SELECT *
FROM productfilters pf
INNER JOIN product pr
ON pf.productid = pr.id
WHERE pf.id >= 200
AND pr.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 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'
)
);
在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
);
就个人而言,我会使用
EXISTS
结构。如此网页上的示例所述:
DELETE ProductFilters pf
WHERE EXISTS (
SELECT *
FROM Products p
WHERE p."productID"=pf."productID"
AND p.NAME= 'Mark'
)
AND pf."id">=200;
我认为更好的方法是使用 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
)
;
请使用子查询
delete from productfilters
where productid in (Select id from products where name='Mark') and Id>200;