Terrence Brannon

NAME

DBIx::Cookbook::Recipe::Searching::subquery_correlated - correlated subquery

DESCRIPTION

Output the results of the query

 SELECT
  *
 FROM
  payment p_outer
 WHERE 
  amount > (SELECT AVG(amount) 
            FROM payment p_inner 
            WHERE p_outer.customer_id=p_inner.customer_id)

Sample Usage:

  shell> ${orm}_cmd subquery_correlated  # orm = dbic, skinny, rose, etc

RECIPES

DBIx::Class

    package DBIx::Cookbook::DBIC::Command::subquery_correlated;
    use Moose;
    extends qw(MooseX::App::Cmd::Command);
    
    
    sub execute {
      my ($self, $opt, $args) = @_;
    
    =for SQL
    
    SELECT
      *
    FROM
      payment p_outer
    WHERE 
      amount > (SELECT AVG(amount) FROM payment p_inner WHERE p_outer.customer_id=p_inner.customer_id)
    
    =cut
    
        my $p_rs = $self->app->schema->resultset('Payment');
    
      my $rs = $p_rs->search
        ({
          amount => { '>' => $p_rs->search
                  (
                   { customer_id => { '=' => \'me.customer_id' } }, 
                       { alias => 'p_inner' }
                      )->get_column('amount')->func_rs('AVG')->as_query
                    }
           });
    
    
      while (my $row = $rs->next) {
        use Data::Dumper;
        my %data = $row->get_columns;
        warn Dumper(\%data);
      }
    }
    
    1;