我有两个结构相似的oracle表, 主要区别在于一个是另一个的子集。 我想要做的是执行一个连接,它将返回子集表中没有的所有行。
问题是唯一标识符大约是6-7列。
所以我不能只做一个WHERE NOT IN
条款。
有谁知道哪种类型的加入或我如何做到这一点?
答案 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
必须具有以下属性:
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,...是唯一标识符