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

同様のケースでは、通常、関連するテーブルで検索を実行します。あなたの場合、table1table2の 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つ必要なのですか?

または、より良いアイデアだと思いますが、データベーストリガーを使用してコードを実装することです。

私はコードをテストしておらず、いくつかの間違いが含まれている可能性があることを考慮してください。

于 2013-08-26T13:07:55.243 に答える
0

*_related メソッドの使用についてはどうですか?

于 2013-08-26T09:15:20.713 に答える