根据临时表删除表的子集

时间:2015-04-08 20:53:43

标签: sql oracle sql-delete

我有一张桌子,说myTable。我还有一个临时表,比如myTableTemp,其中包含我希望<{>>保持 消除的确切值myTablemyTable比我需要的更有价值。

我最初认为我可以删除myTable,然后将myTableTemp重命名为myTable。然而,我不想触及许多FK限制。理论上,我的查询看起来像:

DELETE FROM myTable where in (myTableTemp);

至少在逻辑上这就是我的想法

编辑:临时表包含我想从myTable

删除的数据

2 个答案:

答案 0 :(得分:3)

DELETE FROM myTable where in (myTableTemp);

上面不是倒退吗?您不想保留myTableTemp中的所有值吗?

我会做以下事情:

DELETE FROM myTable t1
 WHERE NOT EXISTS ( SELECT 1 FROM myTableTemp t2
                     WHERE t2.primary_key = t1.primary_key );

同样,假设您要将所有内容保留在myTableTemp中,并删除myTable中不在myTableTemp内的所有内容。

答案 1 :(得分:1)

作为消除来自myTablemyTableTemp项目的替代解决方案:

DELETE FROM myTable
 WHERE primary_key IN ( SELECT primary_key FROM myTableTemp )
;

通常认为[NOT] EXISTS查询的效果优于使用[NOT] IN的查询。但是it is not always that obvious