问题描述
我需要在 oracle 和 postgresql 上执行完全相同的查询,其中我需要使用表 2 上的连接从表 1 中删除行。 我已经有了一个有效的查询,但它停止为 oracle 工作,在“IN”语句中有 1000 多个结果。
delete from t1
where
t1.oid IN
(SELECT oid from t2 WHERE [condition])
我读过关于连接的文章,但 postgresql 使用了“using”关键字
DELETE [target table]
FROM [table1]
INNER JOIN [table2]
ON [table1.[joining column] = [table2].[joining column]
WHERE [condition]
感谢任何帮助,谢谢
解决方法
Oracle 不支持 DELETE 语句的 JOIN 或 USING 或类似的东西。如果您需要在 Postgres 和 Oracle 上运行的东西,您唯一的选择是 IN
或 EXISTS
。
如果 IN
条件太慢,则尝试 EXISTS 条件:
delete from t1
where exists (select *
from t2
where t2.oid = t1.oid
and [condition])
,
您可以使用多维 IN
表达式(最多可处理 100,000 个项目):
DELETE FROM t1
WHERE ( t1.oid,1 ) IN ( SELECT oid,1 FROM t2 );
或 EXISTS
(应该适用于任何数量的行):
DELETE FROM t1
WHERE EXISTS ( SELECT 1 FROM t2 WHERE t1.oid = t2.oid );
并根据需要将 WHERE
条件添加到子查询中。