The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

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;