Ответы:
Если вы хотите просто первую выбранную строку, вы можете:
select fname from MyTbl where rownum = 1
Вы также можете использовать аналитические функции для заказа и взять верхний x:
select max(fname) over (rank() order by some_factor) from MyTbl
SELECT *
FROM (SELECT * FROM MyTbl ORDER BY Fname )
WHERE ROWNUM = 1;
top X
можно изменить наWHERE ROWNUM <= X
С участием 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 там.
TIES
. Направьте это в тех случаях, когда связи происходят для версии 12c +
и12c -
Вы можете использовать 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 просто стремится читать и поддерживать запросы. Правильно? @ Сарат Аванаву
Использование:
SELECT x.*
FROM (SELECT fname
FROM MyTbl) x
WHERE ROWNUM = 1
При использовании Oracle9i + вы можете использовать аналитические функции, такие как ROW_NUMBER (), но они не будут работать так же хорошо, как ROWNUM .
Чтобы выбрать первую строку из таблицы и выбрать одну строку из таблицы, это две разные задачи, и для них требуется другой запрос. Есть много возможных способов сделать это. Четыре из них:
Первый
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
Вы можете заказать свой результат, прежде чем иметь первое значение сверху.
Удачи