首页 > 解决方案 > 单独放置 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;

标签: sqloraclesql-order-byunionwindow-functions

解决方案


我想知道为什么我必须将“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

把它应用到你的情况、长度和东西上。


推荐阅读