加入两个查询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 列信息时出现存储过程错误
尝试在 SQL 查询中输入 0 到 11 之间的月份时出现 oracle 错误 ORA-01843