使用ORDER BY对数据进行排序

jmg*_*880 2 sql oracle perl sql-order-by

这是我想要排序的数据.

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
Run Code Online (Sandbox Code Playgroud)

这是ORDER BY的结果:

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
Run Code Online (Sandbox Code Playgroud)

同样的输出,所以出了点问题.

这是我到目前为止所尝试的

$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);
Run Code Online (Sandbox Code Playgroud)

这不起作用,并且不按名称对最后一列进行排序.难道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>";
Run Code Online (Sandbox Code Playgroud)

Gar*_*ers 5

它不是SQL!

perl代码显示了两个循环.

遍历@raw_data数组中每个条目的外部循环.每个@raw_data'记录'的值作为SITE_NAME参数传递给SELECT语句.

您正在执行多个SELECT语句,每个语句对应一个不同的站点.每个SELECT返回一个有序的行集,但它们都为单个站点返回一行.它是@raw_data数组中站点名称的顺序,它驱动输出的顺序.

<------------------------------------------------- --------------------->旧条目完全具有误导性.

我会提供一些可能性.

(1)这是一个错误.DISTINCT经常(但不一定)会删除重复项.由于某种原因,它可能因为选择了查询计划而确定ORDER BY是多余的.

要确定这一点,请检查查询计划.EXPLAIN PLAN最简单,但最好将DBMS_XPLAN.DISPLAY_CURSOR与v $ sql中的sql_id用于该SQL.

(2)数据正在排序,但是有一些原因导致排序顺序不是你期望的.尝试用DUMP(PE_FQDN)PE_FQDN替换PE_FQDN.这将显示它实际使用的字节.

(3)SELECT看起来并不完全如你所说.例如

SELECT FRED BILL, BILL BILL_TOO
FROM table
ORDER BY BILL
Run Code Online (Sandbox Code Playgroud)

实际上将由具有别名BILL(列为FRED)而不是列BILL的列排序.

SELECT FRED, BULL
FROM table
ORDER BY 'FRED'
Run Code Online (Sandbox Code Playgroud)

将按字符串'FRED'排序,而不是FRED列中的值(因为所有内容都按相同的值排序,它实际上不会做任何事情).

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