+ -
当前位置:首页 → 问答吧 → 求助,关于perl SQL 递归查询问题

求助,关于perl SQL 递归查询问题

时间:2010-10-11

来源:互联网

各位高手,大家好,

我使用perl的Win32::ODBC在做SQL查询的时候遇到了一个问题。我需要统计一个节点下的多个节点的总数,
也就是说,数据库描述的是一个树形结构,每一个节点是一个树叶(叶子节点)或者一个文件夹(还有子节点),层数是未知的,目前的问题是
在使用
$db_handle->Sql($cmd)
做查询的时候,我想对每一个节点再做递归查询,但问题是,Win32::ODBC每次查询之后会保存一个查询上下文(也就是查询语句和结果),如果对某一条记录继续查询的话,会破坏前一个查询上下文从而无法实现递归查询,目前的想法是把所有节点都保存到一个数组里,再对每一个节点做检查,但是层数是未知的,所以也无法硬性实现。
不知道有没有人遇到过和我相同的问题,谢谢!

作者: hepower   发布时间: 2010-10-11

最好不要所有都保存到一个数组里面,保存成一个类似的树型结构是最清晰的。另外 Perl 的 hash 和 array 从来没有限制是固定大小的啊

作者: zhlong8   发布时间: 2010-10-11

建议方法有两种:
     如果需要保存树的结构,建议用递归加hash
  1. my %result;
  2. my $root = '根节点';
  3. &lala($root,\%result);

  4. sub lala(){
  5.     my ($node,$result_ref) = shift;
  6.     my %temp_hash;
  7.     $$result_ref{$node} = \%temp_hash;
  8.     my @temp = &search_sub_node($node);
  9.     for(@temp){
  10.         if(-d $_){
  11.             $temp_hash{$_} = {};
  12.             &lala($_,\%temp_hash);
  13.         }
  14.         else{
  15.             $temp_hash{$_} = undef;
  16.         }
  17.     }
  18. }
复制代码
如果只是统计,用堆栈可能会更快一点
  1. my @result;
  2. my $root = '根节点';
  3. @result = &lele($root);
  4. sub lele(){
  5.     my @folder = @_;
  6.     my @temp_result;
  7.     while(scalar @folder >0){
  8.         my $node = shift @folder;
  9.         my @temp = &search_sub_node($node);
  10.         for(@temp){
  11.             if(-d $_){
  12.                 push @folder,$_;
  13.             }
  14.             else{
  15.                 push @result,$_;
  16.             }
  17.         }
  18.     }
  19.     return @temp_result;
  20. }
复制代码

作者: 珞水的大叔   发布时间: 2010-10-11