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