【问题标题】:Oracle 11g: JoinsOracle 11g:联接
【发布时间】:2018-11-24 03:17:42
【问题描述】:

为了得到右下方的蓝色区域,我正在做:

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

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

【问题讨论】:

  • 是的,有更好的办法!

标签: sql join oracle11g


【解决方案1】:

我会使用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) 上建立索引。在大多数情况下,这可能是可能的解决方案中性能最好的。

虽然您可以使用JOINs 和设置操作,但我发现这是表达此特定逻辑的最简单方法。

请注意,UNIONMINUS 之类的集合操作可能会产生意想不到的副作用——尤其是删除表内以及表间的重复项。 p>

【讨论】:

  • 感谢您的回答。性能有区别吗?
【解决方案2】:

你可以用这个:

SELECT * FROM TABLE2 T2
LEFT JOIN TABLE1 T1 on T1.KOL = T2.KOL
WHERE T1.KOL is NULL;

条件是“删除”所有匹配的行。所以在结果中你有 Right join Minus Inner join。

编辑:错误的表名:) EDIT2:我认为我的方式比@Gordon Linoff 更好,因为它更容易使用提示。我们的 3 种不同的获取结果的方式可以由 oracle 以相同的执行计划执行。但在我的结果中很容易控制提示 :) 并且非常简单。

【讨论】:

  • 谢谢!它确实返回与@Gordon Linoff 的NOT EXISTS 方法返回相同的结果。我无法确认您的解决方案是否更好(不是我的专业领域),但我想其他人会。尽管如此,还是投了赞成票。
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
相关资源
最近更新 更多