2017-08-26 22 views
1

目標是選擇名稱最短的城市。簡單SQL命令錯誤及其解決方法

我很新的SQL,我無法理解的問題,爲下面的查詢的原因:

SELECT city, min(len) 
    FROM (SELECT city, length(city) AS len 
      FROM station 
      GROUP BY city 
     ) 
; 

它引發錯誤:

ERROR at line 1:

ORA-00937: not a single-group group function

我GOOGLE了這個問題,它說如果我使用聚合函數(如min),則必須有GROUP BY。所以,我試過如下:

SELECT city, min(len) 
    FROM (select city, length(city) AS len 
      FROM station 
      GROUP BY city 
     ) 
    GROUP BY city 
; 

但是,這給了我min的每一個城市(我懷疑)。

然後我試圖group by len

SELECT city, min(len) 
    FROM (select city, length(city) AS len 
      FROM station 
      GROUP BY city 
     ) 
    GROUP BY len 
; 

,但它給了我另一個錯誤:

ERROR at line 1:

ORA-00979: not a GROUP BY expression

我不明白爲什麼... 我怎麼會選擇分鐘,整列?

enter image description here

+0

這不是MySQL和SQL不服務器 –

+2

您已經標記了與MySQL和Microsoft SQL Server的問題還沒有得到Oracle錯誤消息。你知道你使用的DBMS嗎? –

+0

@DanGuzman哈哈......不!我只是在HackerRank上選擇了這條SQL軌道。我不知道它使用的是什麼DBMS。但謝謝澄清 – YohanRoth

回答

1

可以有一個以上的城市具有相同的最小長度。如果你第一次發現的最小長度是多少,那麼你可以篩選基於該長度:

SELECT city 
    FROM station 
    WHERE length(city) = (SELECT MIN(length(city)) FROM station) 
; 
1

一些更多的途徑中專門針對甲骨文:

如果在最短的名字不止一個城市的聯繫,列出它們所有(需要Oracle 12.1):

select city, length(city) 
from station 
order by length(city) 
fetch first row with ties; 

報告只有一個城市,用最短的名稱,使用字母順序作爲決勝:

select city, length(city) 
from station 
order by length(city), city 
fetch first row only; 

對於早期版本的Oracle:

select city, name_length 
from (select city, length(city) as name_length 
       , dense_rank() over (order by length(city)) as length_rank 
     from station) 
where length_rank = 1 
order by city;