Oracle SQL中如何按日期(BASHO)合并三张相扑结果表并排序?
相扑比赛结果表合并与排序问题
需求:合并sumo_2019、sumo_2018、sumo_2017三张相扑比赛结果表,筛选出Rikishi1_ID=12191的数据,并按BASHO日期从2019年开始降序排序,在Oracle Apex中操作时遇到排序报错。
尝试过的SQL写法及报错信息
写法一
Select a.* from sumo_2019 a where a.Rikishi1_ID=12191 order by a.BASHO Union Select b.* from sumo_2018 b where b.Rikishi1_ID=12191 order by b.BASHO Union Select c.* from sumo_2017 c where c.RIKISHI1_ID=12191 Order by c.BASHO
报错:ORA-00933: SQL command not properly ended
写法二
Select a.* from sumo_2019 a where a.Rikishi1_ID=12191 Union Select b.* from sumo_2018 b where b.Rikishi1_ID=12191 Union Select c.* from sumo_2017 c where c.RIKISHI1_ID=12191 Order by BASHO
报错:ORA-00904: "BASHO": invalid identifier
问题分析与解决方法
错误原因
- 写法一错误:在
UNION操作中,每个单独的SELECT语句不能添加ORDER BY,只有当所有SELECT语句合并完成后,才能对整个结果集进行排序。 - 写法二错误:
ORA-00904表示BASHO不是有效标识符,可能是以下原因:- 某张表中不存在
BASHO列,或列名拼写/大小写不一致(比如部分表中列名为小写basho,Oracle区分大小写时需要用双引号包裹); - 使用
SELECT *时,合并后的结果集列名以第一个SELECT的列名为准,若第一张表的BASHO列存在命名差异,会导致识别失败。
- 某张表中不存在
正确SQL写法
方式一:子查询包裹后统一排序(推荐)
确保三张表的列结构完全一致(数量、顺序、数据类型),用子查询先合并数据,再对整体结果排序:
SELECT * FROM ( SELECT * FROM sumo_2019 WHERE Rikishi1_ID = 12191 UNION SELECT * FROM sumo_2018 WHERE Rikishi1_ID = 12191 UNION SELECT * FROM sumo_2017 WHERE RIKISHI1_ID = 12191 ) ORDER BY BASHO DESC;
方式二:显式指定列名(避免歧义)
如果不确定三张表列名是否完全匹配,显式列出需要的列,确保BASHO列在每张表中都存在且拼写正确:
SELECT BASHO, Rikishi1_ID, 列名3, 列名4... -- 补充所有需要的列 FROM ( SELECT BASHO, Rikishi1_ID, 列名3, 列名4... FROM sumo_2019 WHERE Rikishi1_ID = 12191 UNION SELECT BASHO, Rikishi1_ID, 列名3, 列名4... FROM sumo_2018 WHERE Rikishi1_ID = 12191 UNION SELECT BASHO, RIKISHI1_ID, 列名3, 列名4... FROM sumo_2017 WHERE RIKISHI1_ID = 12191 ) ORDER BY BASHO DESC;
补充说明
- 如果三张表的数据无重复,建议用
UNION ALL替代UNION,执行效率更高(UNION会自动去重,UNION ALL不会); - 若
BASHO是日期类型,ORDER BY BASHO DESC会自动从最新日期(2019年)开始降序排列。
内容的提问来源于stack exchange,提问作者Ryan_Brusseau
相关产品推荐
相关产品推荐

