my $dbh = DBI::connect(@connect_values_here); get_categories_at( undef ); sub get_categories_at { my $parent_id = shift; my @values; my $sql = "SELECT * FROM TABLE WHERE "; if (not defined $parent_id) { $sql .= "parent_id IS NULL"; } else { $sql .= "parent_id = ?"; push @values, $parent_id; } my $hash_ref = $dbh->selectall_hashref( $sql, 'id', {}, @values); for my $id (keys %{$hash_ref}) { print "ID => $id\n"; get_categories_at( $hash_ref->{$id}{parent_id} ); } }