加入两个查询Oracle SQL时出现问题

Posted

技术标签:

【中文标题】加入两个查询Oracle SQL时出现问题【英文标题】:Trouble when joining two queries Oracle SQL 【发布时间】:2020-11-22 03:51:08 【问题描述】:

我有一张这样的员工表:

ENAME     JOB 
Jack      Clerk
Adam      Manager
Raphael   President

我的想法是获取具有最大长度和最小长度(每个 1 个)的名称,如果长度相同,则取按字母顺序排在第一位的名称(例如 Jack 和Adam,都是 4 个字符,需要 Adam):

ENAME      LENGTH
Adam         4
Raphael      7

我找不到在一个唯一查询中执行此操作的方法,因此我尝试加入两个查询,但它一直给我错误('ORA-00933:SQL 命令未正确结束'),我不知道为什么:

SELECT ENAME, LENGTH(ENAME) FROM EMP
GROUP BY ENAME
HAVING LENGTH(ENAME) = (SELECT MAX(LENGTH(ENAME)) FROM emp) 
ORDER BY ENAME
FETCH FIRST 1 ROW ONLY
union all
SELECT ENAME, LENGTH(ENAME) FROM EMP
GROUP BY ENAME
HAVING LENGTH(ENAME) = (SELECT MIN(LENGTH(ENAME)) FROM emp) 
ORDER BY ENAME
FETCH FIRST 1 ROW ONLY;

【问题讨论】:

在这里发帖时请不要大喊大叫。全部大写的文本更难阅读和理解,并且不会更快地为您提供帮助。当您要求我们提供免费帮助时,对我们大喊大叫也是相当不礼貌的。谢谢。 知道了!从现在开始会解决这个问题。 【参考方案1】:
SELECT ENAME, LENGTH(ENAME) FROM EMP
GROUP BY ENAME
HAVING LENGTH(ENAME) = (SELECT MAX(LENGTH(ENAME)) FROM emp) 
--ORDER BY 1
--FETCH FIRST 1 ROW ONLY
union 
SELECT ENAME, LENGTH(ENAME) FROM EMP
GROUP BY ENAME
HAVING LENGTH(ENAME) = (SELECT MIN(LENGTH(ENAME)) FROM emp) 
ORDER BY 1
FETCH FIRST 1 ROW ONLY;

【讨论】:

【参考方案2】:

一种方法使用聚合和union all

select min(name) keep (dense_rank first order by len(name) asc), min(len(name))
from emp
union all
select min(name) keep (dense_rank first order by len(name) desc, max(len(name))
from emp;

keep 语法是 Oracle 拥有“第一”聚合函数的相当冗长的方式。

【讨论】:

我做到了,但得到了这个:ORA-30492:需要 FIRST 或 LAST 关键字之一。知道为什么吗?谢谢! @jose.gp 。 . .固定。

以上是关于加入两个查询Oracle SQL时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE PL/SQL 在查询 3 列信息时出现存储过程错误

加入两个包含 SUM() 函数的子查询时出现无效操作错误

尝试在 SQL 查询中输入 0 到 11 之间的月份时出现 oracle 错误 ORA-01843

ORACLE 数据库中在将date类型转换成varchar类型时出现问题。SQL如下:

尝试加入提取日期和月份时出现 SQL 错误

使用 EclipseLink 在 Oracle 上执行查询时出现奇怪的行为