Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 单独放置WHERE语句以使联合函数工作_Sql_Oracle_Sql Order By_Union_Window Functions - Fatal编程技术网

Sql 单独放置WHERE语句以使联合函数工作

Sql 单独放置WHERE语句以使联合函数工作,sql,oracle,sql-order-by,union,window-functions,Sql,Oracle,Sql Order By,Union,Window Functions,我正在做一个黑客银行的练习,在那里我必须找到名字最短和名字最长的城市,如果名字中有很多相同数量的字符,那么按照字母顺序选择第一个 这是提供的表格 经过多次尝试,我成功地创建了这段代码 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, LEN

我正在做一个黑客银行的练习,在那里我必须找到名字最短和名字最长的城市,如果名字中有很多相同数量的字符,那么按照字母顺序选择第一个

这是提供的表格

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

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*中才能让联合工作

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;

我建议使用
row\u number()
而不是
rownum
。使用它,您不需要
联合
,只需执行以下操作:

select *
from (
    select s.*, 
        row_number() over(order by length(city), city) rn_asc,
        row_number() over(order by length(city) desc, city) rn_desc
    from station s
) s
where 1 in (rn_asc, rn_desc)
如果使用
union
(效率低于上述解决方案),则行限制条款更合适(从Oracle 12c开始提供):

我想知道为什么我必须将“WHERE ROWNUM=1”单独放置在SELECT*中才能使工会工作

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;
它与
UNION
无关,而是与
orderby
有关

您发布的第二个查询肯定没有达到预期效果,因为
WHERE
子句在
orderby
之前执行,因此:

select city
from station
where rownum = 1
order by city
说明:给我表格中的第一个随机行,然后按城市对该行进行排序

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

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

把它应用到你的情况、长度和其他方面。

好的,我现在明白为什么逻辑在第一个表上不起作用了。但是假设我想在两种情况下得到第一个随机行,然后放置一个联合,所以我得到了两个结果,为什么联合在第二种情况下不起作用?好的,但是假设在我的第二个查询中,两个查询都是正确的,那么为什么我不能在它们之间放置一个联合来加入它们呢?当我的WHERE子句在外部但在第二个查询中没有时,为什么我的查询可以工作?我现在明白了,在我的第二个查询中,orderby应该是第一个,WHERE应该是第二个,但是假设它是正确的,为什么我不能在它们之间加一个并集呢?