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