oracle中的MINUS运算符

Liz*_*zie 11 sql oracle oracle10g

MINUS运营商

我有2张桌子A和B.

SELECT COUNT(*) FROM (SELECT * FROM tableA)
Run Code Online (Sandbox Code Playgroud)

返回389

SELECT COUNT(*) FROM (SELECT * FROM tableB)
Run Code Online (Sandbox Code Playgroud)

返回217

SELECT COUNT(*) FROM
(SELECT * FROM tableA
INTERSECT
SELECT * FROM tableB)
Run Code Online (Sandbox Code Playgroud)

返回0

SELECT COUNT(*) FROM 
(SELECT * FROM tableA
MINUS
SELECT * FROM tableB)
Run Code Online (Sandbox Code Playgroud)

返回389

SELECT COUNT(*) FROM 
(SELECT * FROM tableB
MINUS
SELECT * FROM tableA)
Run Code Online (Sandbox Code Playgroud)

返回89

有人可以解释为什么最后一个查询返回89而不是217?

Jef*_*emp 20

MINUS获取第一个结果集,并删除第二个结果集中存在的任何结果集; 它也删除任何重复.

在您的示例中,tableA有389行,tableB有217行; 你的INTERSECT显示没有共同的行,这意味着tableA MINUS tableB是389行(即所有这些行).

tableB MINUS tableA返回tableB中不同的行集,因此tableB中有89个不同的值.


akz*_*ere 10

假设你有A和B,A = {1,2,3,4}和count(A)= 4,B = {5,6,6,7,7}和count(B)= 5

AB = {1,2,3,4}因此计数(AB)=计数(A)= 4

但BA = {5,6,7}且计数(B)= 3

因此,我们在此理解的是,减去了重复的术语(或行).这就是行数从217减少到89的原因.

希望这可以帮助.