oracle找到2个表之间的差异

时间:2012-11-29 17:20:24

标签: oracle

我有两个结构相同的表。一个是临时的,另一个是刺激的。每次加载整个数据集,有时此数据集将从先前的数据集中删除记录。我首先将数据集加载到临时表中,如果删除了任何记录,我也想从prod表中删除它们。

那么如何才能找到prod中存在但不存在于temp中的记录?我试过外连接,但它似乎没有工作。它将从左侧或右侧的表中返回所有记录,具体取决于执行左外连接或右外连接。

然后我还要删除prod表中的那些记录。

3 个答案:

答案 0 :(得分:14)

一种方法是使用MINUS运算符

SELECT * FROM table1
MINUS
SELECT * FROM table2

将在table1中显示table2中没有完全匹配的所有行(如果您只想确定两者中是否存在特定键,则显然可以指定较小的列列表表)。

另一种方法是使用NOT EXISTS

SELECT *
  FROM table1 t1
 WHERE NOT EXISTS( SELECT 1
                     FROM table2 t2
                    WHERE t1.some_key = t2.some_key )

答案 1 :(得分:3)

如下:

SELECT * FROM ProdTable WHERE ID NOT IN
   (select ID from TempTable);

它的作用与DELETE语句相同:

DELETE FROM ProdTable WHERE ID NOT IN
   (select ID from TempTable);

答案 2 :(得分:2)

MINUS可以在这里工作 以下语句将结果与MINUS运算符组合在一起,后者仅返回第一个查询返回的行,但不返回第二个查询返回的行:

SELECT * FROM prod
MINUS
SELECT * FROM temp;

减号仅在表格结构相同时才有效