1

我有一个直接在 MySQL 中运行良好的 SQL 查询,但我正在努力将其转换为通过 DBIx::Class 使用,我在这里简化了查询

UPDATE table1, table2
    SET table1.field1 = SOMEFUNC( table1.field4 / table2.field2 )
    WHERE table1.id = table2.id
        AND table1.field3 = table2.field3
        AND table2.field2 IS NOT NULL
        AND table2.field2 > 0;

有什么建议么?

4

2 回答 2

2

在类似的情况下,我通常在相关表上执行搜索。在您的情况下,您有两个结果源:table1table2table1与名为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字段完成了它。为什么你需要另一个?

或者,我认为这是一个更好的主意,是使用数据库触发器来实现您的代码。

请注意,我没有测试过代码,它可能包含一些错误,但你必须掌握如何得到你想要的东西的想法。

于 2013-08-26T13:07:55.243 回答
0

使用 *_related 方法怎么样?

于 2013-08-26T09:15:20.713 回答