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

Sql 使用Oracle,如何查看不匹配的结果?,sql,oracle,join,Sql,Oracle,Join,我有两个结构相似的oracle表, 主要区别在于一个是另一个的子集。 我要做的是执行一个连接,该连接将返回不在子集表中的所有行 问题是唯一标识符大约为6-7列。 所以我不能只做一个WHERE not IN子句。 有人知道哪种类型的联接或我如何实现这一点吗?您可以编写减号查询。确保您在减号查询中提到确切的列名称,即两个SQL中数据类型相同的列的确切数目 因此返回的结果集是两个表之间行的差异。其中not in是答案 查询内容如下: select blam, hoot, kapow from schm

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

问题是唯一标识符大约为6-7列。 所以我不能只做一个
WHERE not IN
子句。
有人知道哪种类型的联接或我如何实现这一点吗?

您可以编写
减号查询。确保您在减号查询中提到确切的
名称,即两个SQL中数据类型相同的
列的确切数目


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

其中not in
是答案

查询内容如下:

select blam, hoot, kapow
from schmarr
where blam not in
( select blam from smashy )
blam
必须具有以下属性:

  • 标识schmarr表和smashy表中的一行
  • 既不是你提到的淘气专栏6,也不是淘气专栏7

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

    假设表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 ....
    

    其中第1列、第2列,。。。如果主键是
    (COL1,COL2,…)
    ,则是唯一标识符:

    简单的答案是使用:

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

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

    此外,所有比较仅在主键上执行,而不检查其他列。看见根据执行计划,您将在我的非常简单的示例中看到,
    外部连接
    的性能更好


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

    SELECT COL1,COL2 FROM T
    WHERE (COL1,COL2) NOT IN (SELECT COL1,COL2 FROM U);
    
    据我所知,
    NOT IN
    操作符是执行所需操作的唯一方法

    SELECT COL1,COL2 
    FROM T LEFT JOIN U
    USING(COL1,COL2)
    WHERE U.ROWID IS NULL;
    
    SELECT COL1,COL2 FROM T
    WHERE (COL1,COL2) NOT IN (SELECT COL1,COL2 FROM U);