Как выбрать только 1 строку из оракула SQL?

54

Я хочу использовать синтаксис oracle для выбора только 1 строки из таблицы DUAL. Например, я хочу выполнить этот запрос:

SELECT user 
  FROM DUAL

... и у него было бы, например, 40 записей. Но мне нужна только одна запись.... И, я хочу, чтобы это произошло без предложения WHERE.

Мне нужно что-то в поле table_name, например:

SELECT FirstRow(user) 
  FROM DUAL
  • 1
    Какая версия Oracle? Использование ROWNUM или ROW_NUMBER (9i +) означало бы необходимость предложения WHERE
  • 1
    Вы назвали стол dual ?
Показать ещё 8 комментариев
Теги:
oracle9i

11 ответов

103

Вы используете ROWNUM.

т.

SELECT user FROM Dual WHERE ROWNUM = 1

http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm

  • 0
    @ypercube, насколько я могу судить, это так. (По крайней мере, это работает для моей установки oracle10g.)
  • 0
    @bdares: это будет работать, да. Но не ваш ответ, с order by .
Показать ещё 4 комментария
21

Я нашел это "решение" скрытым в одном из комментариев. Поскольку я искал это некоторое время, я хотел бы выделить его немного (пока не могу комментировать или делать такие вещи...), поэтому я использовал это:

SELECT * FROM (SELECT [Column] FROM [Table] ORDER BY [Date] DESC) WHERE ROWNUM = 1

Это напечатает нужную запись [Column] из последней записи в таблице, предполагая, что [Date] всегда вставлена ​​через SYSDATE.

  • 0
    Я обнаружил, что это также будет работать, если вы заказываете по ROWID , если вы никогда не удаляете какие-либо записи и всегда заботитесь о последней вставленной / измененной.
  • 0
    @vapcguy: не ожидайте, что ROWID будет заказан, даже если вы никогда не удаляете строку из таблицы! Даже если он работает для вас сейчас, он никогда не будет гарантированно работать в будущих версиях.
Показать ещё 3 комментария
6

Этот синтаксис доступен в Oracle 12c:

select * from some_table fetch first 1 row only;
select * from some_table fetch first 1 rows only;
select * from some_table fetch first 10 row only;
select * from some_table fetch first 10 rows only;

^^ Я просто хотел продемонстрировать, что любая строка или строки (множественное число) могут использоваться независимо от множества требуемого количества строк.)

  • 0
    select * from some_table извлечь только первую 1 строку; его не работает в моем SWL Devloper, ни в SQL плюс, так что ошибка при получении.
  • 0
    Вы используете оракул 12с?
Показать ещё 2 комментария
5

В Oracle нет условия limit 1 (thats MySQL/PostgresSQL), вам нужно указать where rownum = 1.

5

Насколько я знаю, таблица dual в Oracle - это специальная таблица с одной строкой. Таким образом, этого было бы достаточно:

SELECT user
FROM dual
  • 0
    это не правда, выберите пользователя из двойного должен дать вам все пользователи
  • 1
    Этот парень говорит иначе
Показать ещё 3 комментария
5

"FirstRow" - это ограничение и поэтому оно помещается в предложение where не в предложении select. И это называется rownum

select * from dual where rownum = 1;
  • 1
    Обратите внимание, что это не будет работать должным образом в сочетании с ORDER BY , так как упорядочивание происходит только после предложения where. Другими словами, чтобы получить вершину определенного отсортированного запроса, rownum совершенно бесполезен.
  • 0
    @ Nyerguds, это только наполовину правда. Вы можете использовать порядок перед запросом Where с View.
Показать ещё 1 комментарий
4

Ответ:

Вы должны использовать вложенный запрос как:

SELECT *
FROM ANY_TABLE_X 
WHERE ANY_COLUMN_X = (SELECT MAX(ANY_COLUMN_X) FROM ANY_TABLE_X) 

= > В PL/SQL "ROWNUM = 1" не равно "TOP 1" TSQL.

Поэтому вы не можете использовать такой запрос: "select * from any_table_x, где rownum = 1 order by any_column_x;" Потому что оракул получает первую строку, а затем применяет порядок by by.

  • 0
    Пожалуйста, добавьте некоторые уточнения к вашему ответу
  • 0
    Необычный синтаксис следует избегать без уважительной причины. В этом случае было бы полезно указать либо контрольный пример, либо номер ошибки. Я смутно припоминаю некоторые странные проблемы с rownum = 1 , но мы не должны допустить, чтобы старые ошибки больше влияли на наш код.
Показать ещё 1 комментарий
2

Если какая-либо строка будет делать, попробуйте:

select max(user)  
from table;

Нет предложения where.

  • 0
    это работает в оракуле 9i?
  • 9
    Конечно, это займет всего несколько секунд, чтобы вы попробовали это для себя
1
select name, price
  from (
    select name, price, 
    row_number() over (order by price) r
      from items
  )
where r between 1 and 5; 
0

у нас есть 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)

    select * from 
         ( select * from table_name order by id )

   where nownum= 1    
-2

Более гибким, чем select max(), является:

select distinct first_row(column_x) over (order by column_y,column_z,...) from Table_A

Ещё вопросы

Сообщество Overcoder
Наверх
Меню