Использование ORDER BY для сортировки данных - PullRequest
2 голосов
/ 15 марта 2011

Это данные, которые я хотел бы отсортировать.

AAAAAAAA    0.0.0.0   hs01.stuff.net
BBBBBBBB    0.0.0.0   hs01.morestuff.net
CCCCCCCC    0.0.0.0   hs01.evenmorestuff.net
DDDDDDDD    0.0.0.0   hs01.stuff.net
EEEEEEEE    0.0.0.0   hs01.stuff.net
FFFFFFFF    0.0.0.0   hs01.evenmorestuff.net
GGGGGGGG    0.0.0.0   hs01.stuff.net
HHHHHHHH    0.0.0.0   hs01.evenmorestuff.net

Это результат ЗАКАЗА ПО:

AAAAAAAA    0.0.0.0   hs01.stuff.net
BBBBBBBB    0.0.0.0   hs01.morestuff.net
CCCCCCCC    0.0.0.0   hs01.evenmorestuff.net
DDDDDDDD    0.0.0.0   hs01.stuff.net
EEEEEEEE    0.0.0.0   hs01.stuff.net
FFFFFFFF    0.0.0.0   hs01.evenmorestuff.net
GGGGGGGG    0.0.0.0   hs01.stuff.net
HHHHHHHH    0.0.0.0   hs01.evenmorestuff.net

Тот же выход, поэтому что-то пошло не так.

Это то, что я пробовал до сих пор

$dbh_source2 = DBI->
connect("dbi:Oracle:host=????;port=????;sid=????",'????','????');

$SEL = "SELECT DISTINCT 
               PE_LOOPBACK_IP,
               PE_FQDN 
          FROM TABLE_NAME
         WHERE SITE_NAME = ? 
      ORDER BY PE_FQDN";

$sth = $dbh_source2->prepare($SEL);

Это не работает и не сортирует последний столбец по имени. ORDER BY сортирует только по первому символу? Номера в имени приводят к сбою?

Вот код, который я использую для отображения данных:

print '<table border=1>';
print '<tr>';
print '<th>Tower name</th>';
print '<th>SUR IP</th>';
print '<th>SUR FQDN</th>';
print '</tr>';
foreach my $data_line (@raw_data) {
        chomp $data_line;

        $sth->execute($data_line);

        while (my @row = $sth->fetchrow_array ) {
              #Print data into cells#
              print "<tr>";
              print "<td>$data_line</td>";
              foreach (@row) {
                print "<td>$_</td>";
              }
              print "</tr>";
              #print "<$data_line>\t @row\n";

    }
}
print "</table>";

Ответы [ 2 ]

5 голосов
/ 16 марта 2011

Это не SQL!

Код perl показывает два цикла.

Внешний цикл обходится для каждой записи в массиве @raw_data.Значение каждой «записи» @raw_data передается как параметр SITE_NAME в инструкцию SELECT.

Вы выполняете несколько операторов SELECT, по одному для каждого отдельного сайта.Каждый отдельный SELECT возвращает упорядоченный набор строк, но все они возвращают одну строку для одного сайта.Порядок имен сайтов в массиве @raw_data определяет порядок вывода.

<---------------------------------------------------------------------->Старая запись, которая вводила в заблуждение.

Я предложу несколько возможностей.

(1) Это ошибка.DISTINCT часто, но не обязательно, выполняет сортировку для удаления дубликатов.По какой-то причине МОЖЕТ быть определено, что ORDER BY является избыточным из-за выбранного плана запроса.

Чтобы определить это, проверьте план запроса.EXPLAIN PLAN является самым простым, но лучше использовать DBMS_XPLAN.DISPLAY_CURSOR с sql_id от v $ sql для этого SQL.

(2) Данные сортируются, но есть что-то, вызывающее другой порядок сортировкичем то, что вы ожидаете.Попробуйте заменить PE_FQDN на DUMP (PE_FQDN) PE_FQDN.Это покажет байты, которые он фактически использует.

(3) SELECT не выглядит точно так, как вы сказали.Например,

SELECT FRED BILL, BILL BILL_TOO
FROM table
ORDER BY BILL

будет упорядочивать по столбцу с псевдонимом BILL (который является столбцом FRED), а не по столбцу BILL.

SELECT FRED, BULL
FROM table
ORDER BY 'FRED'

будет сортировать по строке«FRED», а не значение в столбце FRED (и поскольку все отсортировано по одному значению, оно фактически ничего не будет делать).

<-------------------------------------------------------------------------------------->

2 голосов
/ 16 марта 2011

Похоже, ваш SQL делает именно то, что вы просите.Вы выполняете свое заявление восемь раз.Каждый раз, когда набор результатов содержит только одну строку, сортировка ничего не делает.

У вас есть два варианта.Вы можете либо изменить свой SQL, чтобы сделать один выбор, который возвращает все строки, которые вы хотите отсортировать, так, как вы хотите.Или вы сохраняете свой существующий SQL, но сохраняете данные, возвращаемые при каждом выполнении, в массиве и сортируете этот массив перед отображением результатов.

...