首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Oracle,如何查看不匹配结果?

使用Oracle,如何查看不匹配结果?
EN

Stack Overflow用户
提问于 2014-12-03 01:58:00
回答 4查看 54关注 0票数 0

我有两个结构相似的oracle表,主要区别是一个是另一个的子集。我想要做的是执行一个连接,它将返回所有不在子集表中的行。

问题是唯一标识符大约是6-7列。所以我不能只做WHERE NOT IN子句。有没有人知道是哪种类型的连接,或者我是怎么做的?

EN

回答 4

Stack Overflow用户

发布于 2014-12-03 02:21:38

假设您的主键是(COL1,COL2,...)

简单的答案是使用MINUS set operator

代码语言:javascript
复制
SELECT COL1,COL2 FROM T
MINUS SELECT COL1,COL2 FROM U;

如果您觉得有必要,或者有更复杂的逻辑,您可能更喜欢使用outer join

代码语言:javascript
复制
SELECT COL1,COL2 
FROM T LEFT JOIN U
USING(COL1,COL2)
WHERE U.ROWID IS NULL;

请注意,过滤掉结果集的WHERE子句只保留U表中不存在的行的PK。

此外,只对主键执行所有比较,而不检查其他列。参见http://sqlfiddle.com/#!4/6e42f/13。根据执行计划,您将看到在我的非常简单的示例中,OUTER JOIN执行得更好。

话虽如此,子查询语法的性能可能会更好,因为Oracle优化器构建的执行计划与外连接几乎相同。但是,关键的区别是使用了反嵌套循环,消除了对额外NOT NULL过滤器的需要:

代码语言:javascript
复制
SELECT COL1,COL2 FROM T
WHERE (COL1,COL2) NOT IN (SELECT COL1,COL2 FROM U);

据我所知,NOT IN操作符是执行所需anti join的唯一方法。

票数 2
EN

Stack Overflow用户

发布于 2014-12-03 02:02:51

您可以编写MINUS查询。确保提到确切的column名称,即在减号查询中的两个data type中具有相同SQL的确切列数。

这样返回的结果集是两个表之间的行差。

票数 0
EN

Stack Overflow用户

发布于 2014-12-03 02:04:53

where not in就是答案。

查询将如下所示:

代码语言:javascript
复制
select blam, hoot, kapow
from schmarr
where blam not in
( select blam from smashy )

blam必须具有以下属性:

  1. 在schmarr表和smashy表中都标识了一行。
  2. 既不是您提到的淘气列6,也不是您提到的淘气列7。

schmarr表是超集表。smashy表是子集表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27255928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档