我有两个结构相同的表。一个是临时的,另一个是刺激的。每次加载整个数据集,有时此数据集将从先前的数据集中删除记录。我首先将数据集加载到临时表中,如果删除了任何记录,我也想从prod表中删除它们。
那么如何才能找到prod中存在但不存在于temp中的记录?我试过外连接,但它似乎没有工作。它将从左侧或右侧的表中返回所有记录,具体取决于执行左外连接或右外连接。
然后我还要删除prod表中的那些记录。
答案 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;
减号仅在表格结构相同时才有效