我对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'
);
答案 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.
}
}