Использование функции LIMIT является подзапросом - PullRequest
1 голос
/ 21 февраля 2020

Я использую этот запрос:

select city, length(city) 
from station 
where length(city) = (select max(length(city)) from station ) 
   OR length(city) = (select min(length(city)) from station) 
order by city asc;

и когда я добавляю функцию LIMIT к своим подзапросам, потому что мне нужен ровно один результат из этого выбора:

select city, length(city) 
from station 
where length(city) = (select max(length(city)) from station limit 1) 
   OR length(city) = (select min(length(city)) from station limit 1) 
order by city asc;

, тогда я получил ошибка -

ORA-00907: missing right parenthesis 

Любой, кто знает, где я ошибаюсь с этой функцией. Я использую Oracle, я пытался использовать rownum, но это не помогло.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2020

Когда вы используете max(), тогда limit не требуется:

select city, length(city) 
from station 
where length(city) = (select max(length(city)) 
                      from station
                     ) OR 
      length(city) = (select min(length(city)) 
                      from station 
                     ) 
order by city asc;

Однако limit не будет поддерживаться в Oracle.

0 голосов
/ 21 февраля 2020

Oracle не поддерживает синтаксис limi [n]t. Эквивалентом является fetch first [n] rows only (доступно начиная с Oracle 12 c).

Но суть: каждый из подзапросов гарантированно возвращает только одну запись, поэтому * 1005 просто не требуется *.

Кроме того, я бы предложил переписать запросы для использования rank(), что избавляет от необходимости использовать несколько подзапросов и, на мой взгляд, делает логику c более понятной:

select city, length_city
from (
    select 
        city, 
        lenght(city) length_city,
        rank() over(order by length(city)) rn_asc,
        rank() over(order by length(city) desc) rn_desc
    from station
) t
where rn_asc = 1 or rn_desc = 1

Если вы хотите иметь верхние / нижние связи и вам нужен только один из них, вы можете добавить дополнительные критерии упорядочения к функции ранжирования: например, order by length(city), city дает вам первый город в алфавитном порядке, если дубликатов.

...