我有两个结构相似的oracle表,主要区别是一个是另一个的子集。我想要做的是执行一个连接,它将返回所有不在子集表中的行。
问题是唯一标识符大约是6-7列。所以我不能只做WHERE NOT IN子句。有没有人知道是哪种类型的连接,或者我是怎么做的?
发布于 2014-12-03 02:21:38
假设您的主键是(COL1,COL2,...)
简单的答案是使用MINUS set operator
SELECT COL1,COL2 FROM T
MINUS SELECT COL1,COL2 FROM U;如果您觉得有必要,或者有更复杂的逻辑,您可能更喜欢使用outer join
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过滤器的需要:
SELECT COL1,COL2 FROM T
WHERE (COL1,COL2) NOT IN (SELECT COL1,COL2 FROM U);据我所知,NOT IN操作符是执行所需anti join的唯一方法。
发布于 2014-12-03 02:02:51
您可以编写MINUS查询。确保提到确切的column名称,即在减号查询中的两个data type中具有相同SQL的确切列数。
这样返回的结果集是两个表之间的行差。
发布于 2014-12-03 02:04:53
where not in就是答案。
查询将如下所示:
select blam, hoot, kapow
from schmarr
where blam not in
( select blam from smashy )列blam必须具有以下属性:
schmarr表是超集表。smashy表是子集表。
https://stackoverflow.com/questions/27255928
复制相似问题