5

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

那么如何找到 prod 中存在但 temp 中不存在的记录?我尝试了外部连接,但它似乎不起作用。它根据左外连接或右外连接返回左侧或右侧表中的所有记录。

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

4

3 回答 3

26

一种方法是使用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 )
于 2012-11-29T17:25:18.097 回答
3

怎么样:

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

它也与DELETE语句相同:

DELETE FROM ProdTable WHERE ID NOT IN
   (select ID from TempTable);
于 2012-11-29T17:23:28.060 回答
3

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

SELECT * FROM prod
MINUS
SELECT * FROM temp;

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

于 2012-11-29T17:25:31.270 回答