SQL UNION、UNION ALL用法以及常见报错与解决方法

发布于:2023-07-04 ⋅ 阅读:(759) ⋅ 点赞:(0)

SQL UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

报错及解决措施

使用UNION操作符时容易报错如下:

解析错误:org.apache.hadoop.hive.ql.parse.ParseException: line 5:0 cannot recognize input near ‘UNION’ ‘(’ ‘SELECT’ in set operator

把使用的代码简化如下:

SELECT
    device_id
FROM
    tableA
UNION
(SELECT
    device_id
FROM
    tableB as a1
INNER JOIN tableC as a2
on a1.device_id = a2.device_id
)

主要是因为,UNION操作符只能连接字段与字段,而不能连接字段与表 或者 表与表,哪怕字段数以及字段名称、格式都一样也不行。

因此,UNION 操作符前后是不能带有括号的,因为带有括号的话SQL就容易会判定这是一个子查询/表,所以连接时就容易报错

解决方法

  1. 尽量不要在UNION前后使用括号
  2. 如果筛选数据时需要用到子查询或者join操作时,把这类操作统一放到FROM后面,即,先把tableB和tableC 进行join或者其他操作后当成表D,然后再select from 表D

注意事项

  1. SQL 语句中可以使用多个 UNION 运算符

  2. 在使用了 UNION 运算符的各个 SELECT 语句不能包含它们自己的 ORDER BY 或 COMPUTE 子句。而只能在最终的组合结果集(即最后一个 SELECT 语句的后面)使用一个 ORDER BY 或 COMPUTE 子句。

  3. 在使用了 UNION 运算符的各个 SELECT 语句中可以使用 GROUP BY 和 HAVING 子句。

  4. 默认情况下,SQL Server 2005 从左向右对包含 UNION 运算符的语句求值。可使用圆括号指定求值顺序,(我还没有对其他平台做过完整测试,所以还是先统一避免使用括号吧,所以需要指定运算顺序的话,自己把那个先求值的部分写在SQL语句的前面即可)。