Я хочу использовать синтаксис Oracle, чтобы выбрать только 1 строку из таблицы DUAL
. Например, я хочу выполнить такой запрос:
SELECT user
FROM DUAL
... и было бы около 40 записей. Но мне нужна только одна запись. ... И я хочу, чтобы это произошло безWHERE
оговорок.
Мне нужно что-то в поле table_name, например:
SELECT FirstRow(user)
FROM DUAL
dual
?dual
- системная таблица в oracleDUAL
. Это немного похоже#define TRUE 0
на C - конечно, это может сработать для вас, но будущие разработчики будут вас ненавидеть.select user from dual
? Если нет, попробуйте это и посмотрите, что у вас получится. В стандартной системе Oracle вы вернетесь пользователя, с которым выполняете команду.Ответы:
Вы используете ROWNUM.
т.е.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm
источник
order by
.ORDER BY
применяется послеWHERE
.SELECT * FROM (SELECT user FROM Employees ORDER BY SALARY DESC) WHERE ROWNUM <= 10
Я нашел это "решение" спрятанным в одном из комментариев. Поскольку я некоторое время искал это, я хотел бы немного выделить его (пока не могу комментировать или делать такие вещи ...), поэтому я использовал следующее:
Это напечатает мне желаемую запись [Столбец] из самой новой записи в таблице, предполагая, что [Дата] всегда вставляется через SYSDATE.
источник
ROWID
, если вы никогда не удаляете какие-либо записи и всегда заботитесь о последней вставленной / измененной.ROWID
случайно модифицируется Oracle. Это не так. Он основан на фактическом изменении строк, то есть вы удаляете одну, а затем вставляете ее. Вставленный получит старыйROWID
. Есть такие вещи, как статические таблицы, которые никогда не обновляются, как в США, что является хорошим примером. Если бы они изменились, это, вероятно, имело бы другие последствия, в любом случае, когда это нормально.ROWID
можно изменить, хороший администратор баз данных найдет их и сделает все возможное, чтобы избежать их, если бы существовала вероятность, что они влияют на такую статическую таблицу, как я описал только приложение должно работать.SELECT
Вместо этого можно выполнить экспорт таблицы с помощью оператора. Импорт произойдет один раз, а потом никогда больше. Я понимаю, что забота определенно нужна, но проблемы далеко не неизбежны.Этот синтаксис доступен в Oracle 12c:
^^ Я просто хотел продемонстрировать, что можно использовать строку или строки (во множественном числе) независимо от множества желаемого количества строк.)
источник
у нас есть 3 варианта получения первой строки в таблице Oracle DB.
1)
select * from table_name where rownum= 1
лучший способ2)
select * from table_name where id = ( select min(id) from table_name)
3)
источник
Насколько мне известно,
dual
таблица в Oracle - это особая таблица с одной строкой. Итак, этого было бы достаточно:источник
👌 Ответ:
Вы должны использовать вложенный запрос как:
=> В PL / SQL «ROWNUM = 1» НЕ равно «TOP 1» TSQL.
Таким образом, вы не можете использовать такой запрос: «выберите * из any_table_x, где rownum = 1 order by any_column_x;» Поскольку оракул получает первую строку, он применяет предложение order by.
источник
rownum = 1
, но мы не должны больше позволять старым ошибкам влиять на наш код.В
limit 1
Oracle нет условия (это MySQL / PostgresSQL), которое нужно указатьwhere rownum = 1
.источник
"FirstRow" - это ограничение, поэтому его место в
where
предложении, а не вselect
предложении. И это называется rownumисточник
ORDER BY
, поскольку упорядочение происходит только после предложения where. Другими словами, для получения вершины определенного отсортированного запроса rownum совершенно бесполезен.Where
с запросом просмотра.SELECT * FROM (SELECT * FROM ... WHERE ... ORDER BY ...) WHERE ROWNUM = 1
? Что ж, это может сработать, но выглядит довольно глупо, черт возьми.Если подойдет любая строка, попробуйте:
Пункт не где.
источник
источник
select a.user from (select user from users order by user) a where rownum = 1
будет работать лучше всего, другой вариант:
в сценариях, где вам нужны разные подмножества, но я думаю, вы также можете использовать
RANK()
Но мне также нравится,row_number()
over(...)
поскольку группировка не требуется.источник
Если вы хотите вернуть только первую строку отсортированного результата с наименьшим количеством подзапросов, попробуйте следующее:
источник
Более гибкий, чем
select max()
есть:источник