Oracle 11g:连接查询

3
为了在下方获得右侧的蓝色区域,我正在执行以下操作:
SELECT column_name(s)
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name
MINUS
SELECT column_name(s)
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name

在这里输入图片描述

是否有更好的方法?如果有,那么是哪种方法以及为什么?


是的,有更好的方法! - jarlh
2个回答

4
我会使用 not exists:
SELECT t2.*
FROM table2 t2
WHERE NOT EXISTS (SELECT 1 FROM table1 t1 WHERE t2.column_name = t1.column_name);

针对性能问题,您需要在table1(column_name)上创建索引。在大多数情况下,这可能是最佳的解决方案。

虽然您可以使用JOIN和集合运算,但我发现这是表达这个特定逻辑最简单的方法。

请注意,像UNIONMINUS这样的集合运算可能会产生意外的副作用 - 特别是在表内和表间删除重复项。


谢谢您的回答。性能上有区别吗? - Hey StackExchange

2
您可以使用这个:
SELECT * FROM TABLE2 T2
LEFT JOIN TABLE1 T1 on T1.KOL = T2.KOL
WHERE T1.KOL is NULL;

这种情况是“删除”所有匹配的行。因此,在结果中,您会得到右连接减去内连接。

编辑:表名错误 :) 编辑2:我认为我的方法比@Gordon Linoff更好,因为使用提示更容易。我们三种不同的方法可以通过oracle使用相同的执行计划来获得结果。但是在我的结果中,提示非常容易控制 :) 并且非常简单。


谢谢!它确实返回与@Gordon Linoff的“NOT EXISTS”方法相同的结果。我无法确认您的解决方案是否更好(不是我的专业领域),但我想其他人会这样认为。仍然,我投了赞成票。 - Hey StackExchange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接