-- 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');
下面我们通过一个例子来对比一下它们直接的不同。
-
- SELECT * FROM TEST_LEFT
- UNION
- SELECT * FROM TEST_RIGHT;
-
-
- A
- B
- C
- D
- E
-
-
-
- SELECT * FROM TEST_LEFT
- UNION ALL
- SELECT * FROM TEST_RIGHT;
-
-
- A
- A
- B
- B
- C
- A
- B
- B
- D
- E
-
-
-
- SELECT * FROM TEST_LEFT
- INTERSECT
- SELECT * FROM TEST_RIGHT;
-
-
- A
- B
-
-
-
- SELECT * FROM TEST_LEFT
- MINUS
- SELECT * FROM TEST_RIGHT;
-
-
- C
大家对比一下它们之间的结果就可以看出它们之间的区别,不过有个问题需要注意:
UNION 和 INTERSECT 两别集合可以互换的,但是 MINUS 互换将有不同的结果,如下:
-
- SELECT * FROM TEST_LEFT
- MINUS
- SELECT * FROM TEST_RIGHT;
-
-
- C
-
-
-
- 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