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

时间:2014-12-02 17:58:00

标签: sql oracle join

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

问题是唯一标识符大约是6-7列。 所以我不能只做一个WHERE NOT IN条款。 有谁知道哪种类型的加入或我如何做到这一点?

4 个答案:

答案 0 :(得分:2)

假设您的主键是(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的唯一方法。

答案 1 :(得分:0)

您可以撰写MINUS个查询。请务必提及确切的column名称,即MINUS查询中两个SQL中具有相同data type的确切列数。

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

答案 2 :(得分:0)

where not in就是答案。

查询将是这样的:

select blam, hoot, kapow
from schmarr
where blam not in
( select blam from smashy )

blam必须具有以下属性:

  1. 在schmarr和smashy表中都标识了一行。
  2. 既不是淘气的第6列,也不是你提到的顽皮专栏7。
  3. schmarr表是超集表。 smashy表是子集表。

答案 3 :(得分:0)

假设表-B是表-A的子集。

    select * from Table-A left outer join Table-b on 
      Table-A.column1 = Table-b.column2 and 
      Table-A.column2 = Table-b.column2 and ....

其中columns1,column2,...是唯一标识符