1、 对于该问题确实存在UNION前后SELECT语句中的列数不同导致;
2、 以下为个人遇到的一种可能:
在项目开发中由于有张表是动态的,即有个基础表,其他的表按年月根据基础表来生成动态表,动态表结构和基础表保持一致。从动态表和基础表中同时查询数据,且根据各自的条件进行查询并将结果合并返回时,出现了“使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式”错误,sql语句大致如下:
SELECT * FROM test WHERE id >= ‘’ UNION SELECT * FROM test_201501 WHERE id>=’’;
将该sql语句直接在数据库执行,没有出现任何错误,但是在Java代码中使用SQLQuery时出现了该错误,对该问题感觉很纳闷,于是将Java中执行的sql拿出来在数据库中执行还是没有发现问题,但Java中执行该问题依旧存在,由于对合并后的结果还需要根据某字段进行排序操作,于是就自己不断调试,最终sql如下:
SELECT * FROM
(
SELECT * FROM test WHERE id >= ‘’ UNION SELECT * FROM test_201501 WHERE id>=’’
) t ORDER BY ID DESC;
把Java中执行的sql改成以上结果时,该问题得以修复。
说明:UNION后的结果集也可以看做一张临时表,然后从该表中查询数据即可,注意,其中红色的t代表该临时表的表名。