Упорядочивание строки по умолчанию для запроса Select в оракуле

int month = Calendar.getInstance().get( Calendar.MONTH ) + 1;

int quarter = month % 3 == 0?  (month / 3): ( month / 3)+1;
42
задан Old Pro 24 January 2019 в 06:45
поделиться

5 ответов

По словам Тома Кайта: «Если и пока вы не добавите в запрос« порядок по », вы не сможете НИЧЕГО сказать о порядке возвращаемых строк. Ну, если не считать« вы не можете полагаться на порядок возвращаемых строк '. "

См. этот вопрос на asktom.com.

Что касается ROWNUM, то его физически не существует, поэтому его нельзя «освободить». ROWNUM присваивается после получения записи из таблицы, поэтому «WHERE ROWNUM = 5» всегда не будет выбирать какие-либо записи.

@ammoQ: вы можете прочитать эту статью AskTom на GROUP BY заказ. Вкратце:

Гарантирует ли предложение Group By в запросе, что выходные данные будут отсортировано по столбцам "Группировать по" в заказ, даже если нет заказа по пункт?

и мы сказали ...

АБСОЛЮТНО НЕТ,

Никогда не было, никогда не было, никогда будет.

42
ответ дан 26 November 2019 в 23:54
поделиться

Явного порядка следования по умолчанию нет. По очевидным причинам, если вы создаете новую таблицу, вставляете несколько строк и выполняете «select *» без предложения «where», она (очень вероятно) вернет строки в том порядке, в котором они были вставлены.

Но вы никогда не следует полагаться на срабатывание порядка по умолчанию. Если вам нужен конкретный порядок, используйте предложение «порядок по». Например, в версиях Oracle до 9i выполнение «group by» также приводило к сортировке строк по выражению group. В 10g такого поведения больше нет! Из-за этого мне пришлось потрудиться при обновлении инсталляций Oracle.

21
ответ дан 26 November 2019 в 23:54
поделиться

Уже говорилось, что Oracle разрешено выдавать вам строки в любых заказ, который он хочет, когда вы не указываете предложение ORDER BY. Гадать, какой будет порядок, если вы не укажете предложение ORDER BY, бессмысленно. И полагаться на него в вашем коде - это «ход, ограничивающий карьеру».

Простой пример:

SQL> create table t as select level id from dual connect by level <= 10
  2  /

Tabel is aangemaakt.

SQL> select id from t
  2  /

        ID
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rijen zijn geselecteerd.

SQL> delete t where id = 6
  2  /

1 rij is verwijderd.

SQL> insert into t values (6)
  2  /

1 rij is aangemaakt.

SQL> select id from t
  2  /

        ID
----------
         1
         2
         3
         4
         5
         7
         8
         9
        10
         6

10 rijen zijn geselecteerd.

И это только после простого удаления + вставки. Есть и множество других возможных ситуаций. Параллельное выполнение, разделы, упорядоченные по индексу таблицы и многие другие.

5
ответ дан 26 November 2019 в 23:54
поделиться

Хотя это должно быть rownnum (ваш №2), это действительно не гарантируется, и вы не должны доверять ему на 100%.

-3
ответ дан 26 November 2019 в 23:54
поделиться

Я считаю, что он использует скрытый атрибут Rownum Oracle.

Так что ваш № 1, вероятно, прав, если предположить, что не было сделано никаких удалений, которые могли бы освободить rownums для дальнейшего использования.

EDIT: Как говорили другие, вам действительно не следует полагаться на это никогда. Помимо удаления существует множество различных условий, которые могут повлиять на поведение сортировки по умолчанию.

-7
ответ дан 26 November 2019 в 23:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: