同様のケースでは、通常、関連するテーブルで検索を実行します。あなたの場合、table1とtable2の 2 つの検索先があります。table1には、 table2という名前のテーブルtable2 (おそらく) との関係があります。したがって、この関係table2を使用してtable2で検索を実行します。
my $resultset = $schema->resultset('table1')->search_rs(
{
me.field3 => table2.field3,
table2.field2 => {'!=', '' },
table2.field2 > 0
},
{
'join' => 'table2',
'select' => ['me.field1', 'me.field4', 'table2.field2', 'me.field4' / 'table2.field2' ],
'as' => ['field1','field4', 'field2', 'division_result']
}
);
while ( my $this_res_row = $resultset->next ) {
## Presuming somefunc is a perl subroutine
$this_res_row->update( { field1 => somefunc( $this_res_row->get_column('division_result') ) } );
}
多分これはあなたが思いついた解決策です。単一の dbi update() ステートメントでやりたいことを行うことは不可能だと思います。残念ながら、各 update() ステートメントはデータベースに個別にヒットします。
ところで、field3を介して同じテーブルに 2 番目のユニオンを作成するのは良い考えではないと思います。idフィールドを介して既に行われています。なぜもう1つ必要なのですか?
または、より良いアイデアだと思いますが、データベーストリガーを使用してコードを実装することです。
私はコードをテストしておらず、いくつかの間違いが含まれている可能性があることを考慮してください。