这是我想要排序的数据。
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>";
答案 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,但将每次执行返回的数据存储在一个数组中,并在显示结果之前对该数组进行排序。