简述
在Oracle中,Union 和 Union All 都是可以将两条查询结果连接起来集合操作(Set Operation),但使用时要注意区分,以免发生数据错误。今天在将两个结果拼在一起时,发现单独执行时结果A 中有169条,结果B有0条,但union 之后却变成160 条了。原来是使用union的时候会将结果去重。
Union
Union 是将两条select 语句的结果集合并,并且排序后去除重复数据,所以使用union 之后的结果是排过序的。
SELECT * FROM table_A UNION SELECT * FROM table_B;
Union All
Union All 和 Union 不同,是直接将两个结果集合并,不排序,不去重。所以,Union All 的速度比 Union 更快。
SELECT * FROM table_A UNION ALL SELECT * FROM table_B;
Union 条件
两条 select语句返回的字段数和数据类型要求一致。
如果字段为字符(character)类型,则合并后返回值类型如下:
- 如果两个字段的数据类型是 CHAR类型且长度相同,则返回值类型也为此长度的 CHAR类型;如果都是 CHAR类型,但是长度不一致,则返回值类型为 VARCHAR2,长度取二者中长的一个;
- 如果有一个或者两个字段都是 VARCHAR2类型,则返回值的数据类型为 VARCHAR2。
如果字段为数值(numeric)类型,则返回值类型决定于以下优先原则(Numeric Precedence):
- 如果任意一个的数据类型为
BINARY_DOUBLE,则返回值的类型为
BINARY_DOUBLE;
- 如果没有
BINARY_DOUBLE类型,但存在任意一个类型为 BINARY_FLOAT,则返回值类型为 BINARY_FLOAT;
- 如果都是 NUMBER类型,则返回值类型为 NUMBER。
在集合操作中,Oracle不会自动转换类型,所以当两个需要合并的字段分别为character data 和 numeric data 时,Oracle会报错。
参考资料
- Oracle - Union
- Oracle - Union All
- The UNION [ALL], INTERSECT, MINUS Operators
- Numeric Precedence
- Table 2-10 Implicit Type Conversion Matrix