使用ORDER BY对数据进行排序

时间:2011-03-15 20:43:48

标签: sql perl oracle 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

这是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

相同的输出,所以出了问题。

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

$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 个答案:

答案 0 :(得分:5)

这不是SQL!

perl代码显示了两个循环。

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

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

&LT; --------------------------------------------- -------------------------&GT; 旧条目完全是误导。

我会提供一些可能性。

(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
实际上,

将按具有别名BILL(列为FRED)的列排序,而不是由列BILL排序。

SELECT FRED, BULL
FROM table
ORDER BY 'FRED'

将按字符串'FRED'排序,而不是FRED列中的值(因为所有内容都按相同的值排序,它实际上不会执行任何操作)。

&LT; --------------------------------------------- -----------------------------------------&GT;

答案 1 :(得分:2)

看起来你的SQL正在完全按照你的要求去做。你执行你的陈述八次。每次结果集只包含一行时,排序都不会执行任何操作。

您有两种选择。您可以更改SQL,以便执行一个选择,该选择将返回所需的所有行,并根据需要对其进行排序。或者保留现有的SQL,但将每次执行返回的数据存储在一个数组中,并在显示结果之前对该数组进行排序。

相关问题