在类似的情况下,我通常在相关表上执行搜索。在您的情况下,您有两个结果源:table1和table2。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') ) } );
}
也许这是您提出的解决方案,我认为不可能在单个 dbic update() 语句中执行您想要的操作。不幸的是,每个 update() 语句都会单独访问您的数据库。
顺便说一句,我认为通过field3在同一张表上创建第二个联合不是一个好主意,您已经通过id字段完成了它。为什么你需要另一个?
或者,我认为这是一个更好的主意,是使用数据库触发器来实现您的代码。
请注意,我没有测试过代码,它可能包含一些错误,但你必须掌握如何得到你想要的东西的想法。