#sql #oracle #oracle11g #oracle10g #oracle-sqldeveloper
#sql #Oracle #oracle11g #oracle10g #oracle-sqldeveloper
Вопрос:
with tb as(
select 1 as PPT_FROM,40 PPT_TO from dual
union
select 15 as PPT_FROM,40 PPT_TO from dual)
select * from tb
where 40 between PPT_FROM and PPT_TO;
теперь ввод 40 или 15 соответствует обоим диапазонам дат, поэтому я хочу получить максимальную запись, то есть 15 PPT_from и 40 PPT_to
Комментарии:
1. Пожалуйста, покажите нам ожидаемые результаты.
2. Оба
FROM
иTO
являются зарезервированными словами ( en.wikipedia.org/wiki/SQL_reserved_words ), т. Е. эти идентификаторы должны быть разделены как"FROM"
и"TO"
.
Ответ №1:
Я думаю, вы хотите order by
и fetch
:
select *
from tb
where 40 between FROM and TO
order by from desc
fetch first 1 row only;
В старых версиях Oracle (до 12) вам нужен подзапрос:
select tb.*
from (select tb.*
from tb
where 40 between FROM and TO
order by from desc
) tb
where rownum = 1;
Обратите внимание, что FROM
и TO
— очень плохие имена для столбцов, потому что они являются ключевыми словами SQL.
Ответ №2:
Ожидаемые результаты могут быть достигнуты с помощью простого оператора GROUP BY
Запрос
WITH
tb
AS
(SELECT 1 AS PPT_FROM, 40 PPT_TO FROM DUAL
UNION
SELECT 15 AS PPT_FROM, 40 PPT_TO FROM DUAL)
SELECT MAX (ppt_from) AS ppt_from, ppt_to
FROM tb
WHERE 40 BETWEEN PPT_FROM AND PPT_TO
GROUP BY ppt_to;
Результаты
PPT_FROM | PPT_TO
-----------------
15 | 40