sql - 单独放置 WHERE 语句以使 UNION 函数工作
问题描述
我正在做一个hackerrank练习,我必须找到名字最短和名字最长的城市,如果名字中有很多相同数量的字符,那么按字母顺序取第一个
这是提供的表格
经过多次尝试,我设法创建了这个有效的代码
SELECT * FROM (
SELECT CITY, LENGTH(CITY) AS LENGTH_CITY FROM STATION ORDER BY LENGTH_CITY ASC, CITY) WHERE ROWNUM = 1
UNION
SELECT * FROM (
SELECT CITY, LENGTH(CITY) AS LENGTH_CITY FROM STATION ORDER BY LENGTH_CITY DESC, CITY) WHERE ROWNUM = 1;
所以我的问题是,最初我制作了另一段不起作用的代码,我想知道为什么我必须将“WHERE ROWNUM = 1”单独放在 SELECT* 中以便 UNION 工作?
SELECT CITY, LENGTH(CITY) AS LENGTH_CITY FROM STATION WHERE ROWNUM = 1 ORDER BY LENGTH_CITY ASC, CITY
UNION
SELECT CITY, LENGTH(CITY) AS LENGTH_CITY FROM STATION WHERE ROWNUM = 1 ORDER BY LENGTH_CITY DESC, CITY;
解决方案
我想知道为什么我必须将“WHERE ROWNUM = 1”单独放在 SELECT* 中以便 UNION 工作?
它与 无关UNION
,但与ORDER BY
。
您发布的第二个查询肯定没有达到您的预期,因为WHERE
子句在之前执行ORDER BY
,所以:
select city
from station
where rownum = 1
order by city
说:给我表中的第一个随机行,然后按city
.
因此:首先对行进行排序,然后取第一个:
select *
from (select city
from station
order by city
)
where rownum = 1
把它应用到你的情况、长度和东西上。
推荐阅读
- django - Django在同一页面上的两个表单
- android - 取消/关闭图标上的通知
- jquery - DataTables 是否支持波斯语?
- apache - apache2 如何拒绝与非托管域的连接
- qt5 - Qt 设计器使用什么类来编辑 UI 元素的属性?
- javascript - 可重用组件中的 VueJS XHR
- javascript - 如何通过搜索栏(或时间线)控制 3D 动画(collada 文件)
- javascript - 使用 Switch case 更改背景颜色
- javascript - 未捕获的 ReferenceError:在 HTMLSpanElement.onclick (home.html:1) 中未定义 clickDone
- java - android - 使用firestore而不是auth