2016-05-25 3 views
2

Query -Порядок сортировки в SQL Proc

SELECT B.TYPE, 
       B.TYPE_VAL, 
       B.COMP, 
       B.start, 
       B.end, 
       B.lt, 
       B.modify 
      FROM table B 
     WHERE B.start <= sysdate 
      AND B.end >= sysdate 
      AND TRIM(B.type_val) IN 
       ('111-AAA') 
      ORDER BY B.type_val, 
        B.type, 
        B.comp DESC; 

ВЫВОД

+------+----------+------+-----------+------------+----+-----------------+ 
| TYPE | TYPE_VAL | COMP | START | END  | LT |  MODIFY  | 
+------+----------+------+-----------+------------+----+-----------------+ 
| AS | 111-AAA | ** | 5/10/2016 | 12/31/9999 | 1 | 5/10/2016 11:12 | 
| AS | 111-AAA | ** | 3/8/2016 | 12/31/9999 | 68 | 3/8/2016 0:34 | 
| BS | 111-AAA | ** | 6/16/2015 | 6/16/2015 | 7 | 6/16/2015 10:32 | 
| CS | 111-AAA | ** | 5/10/2016 | 12/31/9999 | 1 | 5/10/2016 11:12 | 
| CS | 111-AAA | ** | 3/8/2016 | 12/31/9999 | 13 | 3/8/2016 0:34 | 
| HS | 111-AAA | ** | 5/10/2016 | 12/31/9999 | 1 | 5/10/2016 11:12 | 
| HS | 111-AAA | ** | 3/8/2016 | 12/31/9999 | 13 | 3/8/2016 0:34 | 
| MS | 111-AAA | ** | 5/10/2016 | 12/31/9999 | 1 | 5/10/2016 11:12 | 
| MS | 111-AAA | ** | 3/8/2016 | 12/31/9999 | 13 | 3/8/2016 0:34 | 
| OS | 111-AAA | ** | 5/10/2016 | 12/31/9999 | 1 | 5/10/2016 11:12 | 
| OS | 111-AAA | ** | 3/8/2016 | 12/31/9999 | 13 | 3/8/2016 0:34 | 
| PS | 111-AAA | ** | 3/8/2016 | 12/31/9999 | 13 | 3/8/2016 0:34 | 
| PS | 111-AAA | ** | 5/10/2016 | 12/31/9999 | 1 | 5/10/2016 11:12 | 
| S | 111-AAA | ** | 5/10/2016 | 12/31/9999 | 1 | 5/10/2016 11:12 | 
| S | 111-AAA | ** | 3/8/2016 | 12/31/9999 | 13 | 3/8/2016 0:34 | 
| VS | 111-AAA | ** | 5/10/2016 | 12/31/9999 | 1 | 5/10/2016 11:12 | 
| VS | 111-AAA | ** | 3/8/2016 | 12/31/9999 | 13 | 3/8/2016 0:34 | 
+------+----------+------+-----------+------------+----+-----------------+ 

Если вы заметили данные тянет в виде latest one first then older one.

Для, например, для TYPE AS -

| AS | 111-AAA | ** | 5/10/2016 | 12/31/9999 | 1 | 5/10/2016 11:12 | 
| AS | 111-AAA | ** | 3/8/2016 | 12/31/9999 | 68 | 3/8/2016 0:34 | 

Последние данные 5/10/2016 является то есть первый, а затем 3/8/2016. (MM/DD/YY формат)

Но есть одно исключение здесь, для ТИПА PS - 3/8/2016 is above 5/10/2016 в отличие от всех остальных.

| PS | 111-AAA | ** | 3/8/2016 | 12/31/9999 | 13 | 3/8/2016 0:34 | 
| PS | 111-AAA | ** | 5/10/2016 | 12/31/9999 | 1 | 5/10/2016 11:12 | 

По моим сведениям последнего один в идеале должен быть на вершине, если порядок сортировки одинаков (TYPE, TYPE_VAL и CO не одинаковы, поэтому нет заказа).

Мой вопрос здесь - Почему эта конкретная запись тянется в обратном порядке? Разве это не похоже на то, как все остальные миллионы записей вытягиваются? Должно быть НЕКОТОРЫЕ ОПРЕДЕЛЕННЫЕ причины, почему это происходит.

Я знаю, что большинство из вас ссылается на то, что Oracle не имеет особого способа возврата строк, но здесь это не так.

+0

http://stackoverflow.com/questions/899514/default-row-ordering-for-select-query-in-oracle – Mottor

ответ

2

Если вы не указали явный ORDER BY, база данных может в принципе возвращать строки в любом порядке, который он считает нужным. Это может быть заказ на размещение, но не обязательно.

Если вы хотите отсортировать по start колонке, а также добавить его в ваш ORDER BY:

 ORDER BY B.type_val, 
       B.type, 
       B.comp DESC, 
       B.start; 
+0

Я согласен с тем, что он может вернуться в любом порядке, но почему-то я до сих пор не понимаю почему это происходит только с одной записью. –

+1

@PirateX Это происходит потому, что именно так Oracle удалось получить данные. Если строки были в разных блоках/порядке, то вы, вероятно, снова получили бы другой порядок. Помните, что когда вы храните строки в таблице кучи, внутреннего заказа нет. Если вы удалите строку, Oracle, возможно, решит вставить новую строку на свое место, а не в «конец» таблицы. Простым было то, что никто из нас не знает, что делает Oracle точно под защитой, и это не имеет особого значения. Факт остается фактом: если столбец не находится в порядке заказа, вы не можете гарантировать заказ. – Boneist

+0

@Boneist Я думаю: «Если вы удалите строку, Oracle, возможно, решит вставить новую строку на свое место, а не в« конец »таблицы.« Это имеет смысл для меня. Немного удовлетворения в моей голове о сортировке. –

1

Точно, если заказ не указан на колонке (MODIFY конкретно), строки результирующего набора могут быть возвращены в любом порядке в этом столбце или вообще не указаны. Oracle, MS Sql, любая другая БД будет вести себя одинаково. Почему некоторые paticular ряды имеют этот порядок paticular на MODIFY, а другие ряды имеют различный порядок? Я не думаю, что мы можем это знать, слишком много факторов.

+0

Да, есть много факторов. Можете ли вы сказать мне, что все факторы есть? Мне не нужны объяснения для каждого фактора, я просто буду проверять каждый из них один. –

+0

Физический порядок чтения экстентов дискового пространства, например. Я действительно не знаю, как администратор базы данных или администратор могут контролировать или не сообщать об этом. – Serg

2

Вашего пункт order by является:

ORDER BY B.type_val, B.type, B.comp DESC; 

Ваших пары записей имеют точно такое же значение для этих трех столбцов. Следовательно, они могут появляться в любом порядке. Это совпадение, если некоторые из них находятся в «правильном» порядке, потому что запрос не предоставляет никакой информации о правильном порядке.

Если вы хотите их в определенном порядке, то вам необходимо включить эту информацию в ORDER BY.Например:

ORDER BY B.type_val, B.type, B.comp DESC, B.Modify DESC 
+0

Гордон, Сначала я большой поклонник вас. Во-вторых, все записи находятся в «правильном» порядке, но один. Я искренне думаю, что должен быть какой-то другой фактор, который влияет на эту запись. Это не может быть просто совпадением:/ –

+2

@PirateX 'это не просто совпадение' ... um, может. Если вы бросите монету с неоплаченной монеткой 50 раз подряд, и все 50 раз вышли из головы, считаете ли вы, что это не совпадение? Это просто удача, что вы получили строки в том порядке, в котором вы их получили, потому что (и я думаю, что мы не можем повторять это достаточно часто) ** вы не включили этот столбец в порядке на **. – Boneist

0

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

Обратите внимание на поставщика SQL, который вы используете (MySQL, Orache ...), каждый может работать по-разному.

Смежные вопросы