Псевдостолбцы ведут себя аналогично столбцам таблицы, но реально не хранятся в таблице. Можно выбирать значения из псевдостолбцов, но нельзя вставлять, обновлять или удалять их значения.
Для каждой строки, возвращаемой запросом, псевдостолбец ROWNUM возвращает номер, указывающий порядок, в котором ORACLE выбирает эту строку из таблицы или множества соединенных таблиц. Первая выбираемая строка имеет ROWNUM, равный 1, вторая - 2, и т.д. ORACLE назначает значение ROWNUM каждой строке по мере ее извлечения, перед тем, как эти строки будут отсортированы фразой ORDER BY; поэтому фраза ORDER BY обычно не влияет на значение ROWNUM каждой строки. Однако, если фраза ORDER BY заставляет ORACLE использовать индекс для доступа к данным, то ORACLE может извлекать строки в ином порядке, нежели без индекса, так что значения ROWNUM в этом случае могут быть другими, чем без фразы ORDER BY.
Пример 42. Использование ROWNUM для того, чтобы ограничить число строк, выбираемых запросом:
SELECT * FROM student WHERE ROWNUM < 6;
Пример 43. Использование ROWNUM для того, чтобы присвоить уникальное значение каждой строке таблицы:
UPDATE mytable SET column1 = ROWNUM;
Пример 44. Условия, проверяющие, чтобы значение ROWNUM было больше положительного целого, всегда ложны. Cледующий запрос не вернет ни одной строки:
SELECT * FROM emp WHERE ROWNUM > 1;
Первой извлекаемой по этому запросу строке назначается ROWNUM, равный 1, что делает условие запроса ложным. Поэтому первой выбираемой становится вторая строка, и ей также назначается значение ROWNUM, равное 1, и опять условие запроса ложно. Таким образом, будут последовательно отброшены все строки.
Пример 45. Выберем неповторяющиеся значения баллов с присвоением им рангов. Ранг, равный единице, присваивается наибольшему баллу.
Псевдостолбцу ROWNUM присвоим псевдоним position:
SELECT ROWNUM position, ball FROM (SELECT DISTINCT ball FROM student ORDER BY ball DESC);
Результат:
position | ball |
В начало