我有 2 个结构相同的表。一种是临时的,另一种是刺激的。每次都会加载整个数据集,有时该数据集会从先前的数据集中删除记录。我首先将数据集加载到临时表中,如果删除了任何记录,我也想从 prod 表中删除它们。
那么如何找到 prod 中存在但 temp 中不存在的记录?我尝试了外部连接,但它似乎不起作用。它根据左外连接或右外连接返回左侧或右侧表中的所有记录。
然后我还想删除 prod 表中的那些记录。
我有 2 个结构相同的表。一种是临时的,另一种是刺激的。每次都会加载整个数据集,有时该数据集会从先前的数据集中删除记录。我首先将数据集加载到临时表中,如果删除了任何记录,我也想从 prod 表中删除它们。
那么如何找到 prod 中存在但 temp 中不存在的记录?我尝试了外部连接,但它似乎不起作用。它根据左外连接或右外连接返回左侧或右侧表中的所有记录。
然后我还想删除 prod 表中的那些记录。
一种方法是使用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 )
怎么样:
SELECT * FROM ProdTable WHERE ID NOT IN
(select ID from TempTable);
它也与DELETE
语句相同:
DELETE FROM ProdTable WHERE ID NOT IN
(select ID from TempTable);
MINUS 可以在这里工作 以下语句将结果与 MINUS 运算符组合在一起,该运算符仅返回第一个查询返回的行,而不是第二个查询返回的行:
SELECT * FROM prod
MINUS
SELECT * FROM temp;
减号仅在表结构相同时才有效