Oracle中Union 和 Union All 简述 Union 条件 参考资料

在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)类型,则合并后返回值类型如下:

  1. 如果两个字段的数据类型是 CHAR类型且长度相同,则返回值类型也为此长度的 CHAR类型;如果都是 CHAR类型,但是长度不一致,则返回值类型为 VARCHAR2,长度取二者中长的一个;
  2. 如果有一个或者两个字段都是 VARCHAR2类型,则返回值的数据类型为 VARCHAR2。

如果字段为数值(numeric)类型,则返回值类型决定于以下优先原则(Numeric Precedence):

  1. 如果任意一个的数据类型为 BINARY_DOUBLE,则返回值的类型为 BINARY_DOUBLE;
  2. 如果没有 BINARY_DOUBLE类型,但存在任意一个类型为 BINARY_FLOAT,则返回值类型为 BINARY_FLOAT;
  3. 如果都是 NUMBER类型,则返回值类型为 NUMBER。

在集合操作中,Oracle不会自动转换类型,所以当两个需要合并的字段分别为character data 和 numeric data 时,Oracle会报错。

参考资料