Как мне сделать следующее?
select top 1 Fname from MyTbl
В Oracle 11g?
Если вам нужна только первая выбранная строка, вы можете:
select fname from MyTbl where rownum = 1
Вы также можете использовать аналитические функции, чтобы упорядочить и взять верхний x:
select max(fname) over (rank() order by some_factor) from MyTbl
select max(fname) keep (dense_rank first order by some_factor ) from MyTbl
.
- person Barbaros Özhan; 14.07.2019
С помощью Oracle 12c (июнь 2013 г.) вы можете использовать его следующим образом.
SELECT * FROM MYTABLE
--ORDER BY COLUMNNAME -OPTIONAL
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY
OFFSET 0 ROWS
, по-видимому, не нужен, вы можете использовать FETCH NEXT 1 ROWS ONLY
или даже FETCH FIRST ROW ONLY
, порядок важен, или это будет эквивалентно простому использованию WHERE rownum = 1
. Я даже пробовал это в инструкции OUTER APPLY, и там она работала как функция TOP Ms-SQL.
- person Rafael Merlin; 06.11.2015
TIES
. Обратитесь к this для случаев, когда возникают связи для версий 12c +
и 12c -
.
- person Barbaros Özhan; 14.07.2019
Вы можете использовать ROW_NUMBER()
с предложением ORDER BY
в подзапросе и использовать этот столбец вместо TOP N
. Это можно объяснить пошагово.
См. Таблицу ниже, в которой есть два столбца NAME
и DT_CREATED
.
Если вам нужно взять только первые две даты независимо от NAME
, вы можете использовать запрос ниже. Логика написана внутри запроса
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
-- Generates numbers in a column in sequence in the order of date
SELECT ROW_NUMBER() OVER (ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
РЕЗУЛЬТАТ
В некоторых ситуациях нам нужно выбрать TOP N
результатов, соответствующих каждому NAME
. В таком случае мы можем использовать PARTITION BY
с предложением ORDER BY
в подзапросе. Обратитесь к приведенному ниже запросу.
-- The number of records can be specified in WHERE clause
SELECT RNO,NAME,DT_CREATED
FROM
(
--Generates numbers in a column in sequence in the order of date for each NAME
SELECT ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DT_CREATED) AS RNO,
NAME,DT_CREATED
FROM DEMOTOP
)TAB
WHERE RNO<3;
РЕЗУЛЬТАТ
with (select ... ) as
) ничего не меняет в этой проблеме, CTE просто нацелен на чтение и поддержку запросов. Верно? @Sarath Avanavu
- person Alexo Po.; 11.12.2015
Вы можете сделать что-то вроде
SELECT *
FROM (SELECT Fname FROM MyTbl ORDER BY Fname )
WHERE rownum = 1;
Вы также можете использовать аналитические функции RANK и / или DENSE_RANK, но, вероятно, самый простой вариант - ROWNUM.
Использовать:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
Если вы используете Oracle9i +, вы можете посмотреть на аналитические функции, такие как ROW_NUMBER (), но они не будут работать так же хорошо, как ROWNUM.
TOP
не был принят в качестве средства ANSI для ограничения набора результатов за пределами фильтрации.
- person OMG Ponies; 12.08.2010
SQL
, но не в PL/SQL
в 8i
. Вы должны были использовать EXECUTE IMMEDIATE
, чтобы использовать их в блоке PL/SQL
.
- person Quassnoi; 08.09.2010
8
и 8i
были разными версиями, и только последняя поддерживала аналитику (с R2
, AFAIR). SQL
и PL/SQL
имели разные парсеры, процедурный не понимал аналитики и прочего. EXECUTE IMMEDIATE
был проанализирован парсером SQL
. Они были объединены в 9i
.
- person Quassnoi; 08.09.2010
8i R2
, у нас была встреча, на которой я настаивал на обновлении всех наших клиентов, использующих предыдущие версии (к тому времени более 200
установок), и прекращении поддержки 8
. Разработчики в этой компании до сих пор считают это наиболее важным решением, поскольку следующий конец поддержки произошел только в 2009
.
- person Quassnoi; 08.09.2010
Выбрать первую строку из таблицы и выбрать одну строку из таблицы - это две разные задачи, и для них нужен другой запрос. Есть много способов сделать это. Четыре из них:
Первый
select max(Fname) from MyTbl;
Второй
select min(Fname) from MyTbl;
В третьих
select Fname from MyTbl where rownum = 1;
Четвертый
select max(Fname) from MyTbl where rowid=(select max(rowid) from MyTbl)
У меня была такая же проблема, и я могу исправить это с помощью этого решения:
select a.*, rownum
from (select Fname from MyTbl order by Fname DESC) a
where
rownum = 1
Вы можете упорядочить результат до того, как первое значение будет наверху.
Удачи
top X
его можно изменить на WHERE ROWNUM <= X
- person SomethingSomething; 21.02.2016