sql - 单独放置 WHERE 语句以使 UNION 函数起作用

标签 sql oracle sql-order-by union window-functions

我正在进行一项黑客排名练习,其中我必须找到名称最短和最长的城市,如果名称中有许多相同数量的字符,则按字母顺序取第一个

这是提供的表格

Table

经过多次尝试,我成功创建了这段有效的代码

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;

最佳答案

I was wondering why do I have to place the "WHERE ROWNUM = 1" separately in a SELECT* for the UNION to work?

它与UNION无关,但与ORDER BY有关。

您发布的第二个查询肯定不会执行您想要的操作,因为 WHERE 子句在 ORDER BY 之前执行,因此:

select city
from station
where rownum = 1
order by city

说:给我表中的第一个随机行,然后按城市对该行进行排序。

因此:首先对行进行排序,然后取第一个:

select *
from (select city
      from station
      order by city
     )
where rownum = 1

将其应用于您的情况,长度等等。

关于sql - 单独放置 WHERE 语句以使 UNION 函数起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63854799/

相关文章:

php - 如何从数据库中获取包含类别的随机问题?

SQLite - 根据表b中相关行的计算结果从表a中选择

MYSQL UPDATE 行匹配基于变量的条件

oracle - Toad 中代码的缩进

mysql 精细具体命令类别

mysql - 如何只在满足特定条件的情况下现场下订单?

sql - 分组多行

sql - 第一个记录(如果该记录是重复集中的一个)

c++ - 32 位 ODBC 驱动程序连接到 64 位数据库

sql - 复制一个有索引但没有数据的 Oracle 表