-- Start
Oracle 支持如下几个集合操作符。
UNION 用来求两个集合的并集,并去掉重复值
UNION ALL 用来求两个集合的并集
INTERSECT 用来求两个集合的交集,并去掉重复值
MINUS 用来求在第一个集合中存在,而在第二个集合中不存在的记录,并去掉重复值
下面我们先来准备测试数据。
CREATE TABLE TEST_LEFT
(
COL CHAR
);
INSERT INTO TEST_LEFT VALUES ('A');
INSERT INTO TEST_LEFT VALUES ('A');
INSERT INTO TEST_LEFT VALUES ('B');
INSERT INTO TEST_LEFT VALUES ('B');
INSERT INTO TEST_LEFT VALUES ('C');
CREATE TABLE TEST_RIGHT
(
COL CHAR
);
INSERT INTO TEST_RIGHT VALUES ('A');
INSERT INTO TEST_RIGHT VALUES ('B');
INSERT INTO TEST_RIGHT VALUES ('B');
INSERT INTO TEST_RIGHT VALUES ('D');
INSERT INTO TEST_RIGHT VALUES ('E');
下面我们通过一个例子来对比一下它们直接的不同。
---UNION
SELECT * FROM TEST_LEFT
UNION
SELECT * FROM TEST_RIGHT;
---结果
A
B
C
D
E
---UNION ALL
SELECT * FROM TEST_LEFT
UNION ALL
SELECT * FROM TEST_RIGHT;
---结果
A
A
B
B
C
A
B
B
D
E
---INTERSECT
SELECT * FROM TEST_LEFT
INTERSECT
SELECT * FROM TEST_RIGHT;
---结果
A
B
---MINUS
SELECT * FROM TEST_LEFT
MINUS
SELECT * FROM TEST_RIGHT;
---结果
C
大家对比一下它们之间的结果就可以看出它们之间的区别,不过有个问题需要注意:
UNION 和 INTERSECT 两别集合可以互换的,但是 MINUS 互换将有不同的结果,如下:
---语句1
SELECT * FROM TEST_LEFT
MINUS
SELECT * FROM TEST_RIGHT;
---结果
C
---语句2
SELECT * FROM TEST_RIGHT
MINUS
SELECT * FROM TEST_LEFT;
---结果
D
E
-- 更多参见:Oracle SQL 精萃
-- 声明:转载请注明出处
-- Last Edited on 2014-12-17
-- Created by ShangBo on 2014-12-17
-- End